获得最新的内核源代码树
在使用 Git 管理源代码仓库时,我们可以使用两种方法开始我们的工作。我们可以使用现有代码的一个本地目录,然后从中生成一个仓库;也可以映射其他人发布的仓库。
对于本文的目的来说,我们将获得 Torvalds 发布的 Git 仓库的一个镜像。下面的命令将创建一个名为 linux-2.6 的 Git 仓库。这个目录包含了一个隐藏目录 .git/ 。
$ git-clone \ git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git \ linux-2.6 |
这个步骤会执行很长时间,因为 Git 正在将内核源代码(这有数百兆大)从 kernel.org 传输到本地机器上。输出结果可能有些晦涩难懂,但是如果您有一个快速的 Internet 链接,卷屏的速度应该相当快。输出结果应该类似于图 1 所示。
现在切换到包含新下载的内核的目录中:
$ cd linux-2.6 |
现在,我们应该在本地机器上有一个可以工作的 Linux 2.6 仓库了!此时我们就可以对这个仓库进行一些基本的操作了。
回页首
更新本地 Git 仓库
在使用 Git 时,我们通常可以假设自己的仓库可能比 kernel.org 的仓库有些滞后。因此我们通常都是首先将自己的仓库更新成最新的上游内核树。这个过程有时称为快速合并(fast-forward merge)。严格来说,我们现在并不需要执行这个过程,因为我们刚刚安装了自己的仓库,它应该还没有过期。但是检查一下毕竟没有坏处:
$ cd linux-2.6 $ git-pull git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git ... |
如果成功,我们就应该会看到类似于下面的输出结果:
receiving file list ... done sent 130 bytes received 21677 bytes 14538.00 bytes/sec total size is 127865858 speedup is 5863.52 Already up-to-date. $> |
如果我们的仓库不是最新的,就会看到有些内容通过网络传输到本地机器上了。
回页首
从仓库中导出文件
我们需要将文件从 Git 仓库(隐藏目录中的那些文件)中导出到工作目录中才能开始自己的 hack 过程。下面的命令会在当前目录中写入没有隐藏的目录,其中包含了 Linux 的源代码:
$ git-checkout |
如果您希望覆盖本地修改,可以使用 -f
选项导出文件,这样就可以将您带回到一个干净的状态:
$ git-checkout -f |
现在在当前工作目录中,我们应该就可以看到熟悉的 Linux 源代码目录结构了,然后我们可以对这些源代码任意进行修改。
回页首
修改现有文件
我们现在可以修改所选择的任何文件。举一个简单的例子来说,我们将修改 docs 目录中的一些内容:添加一条以后可以很容易识别的信息。为了让我的例子更容易试验,我没有选择修改源代码;不过只要您希望,欢迎继续重写整个内核的子系统。
首先,让我们在编辑器中打开一个文件:
$ vi ./Documentation/ManagementStyle |
显然,我使用的是 vi;不过您当然可以使用自己喜欢的任何编辑器来完成这项工作。在编辑文件时,我在第一段前面添加了一行:“Eli shall be in charge of managing sandwich consumption. See Documentation/Sandwiches for more.”
如果您对自己所做的修改非常满意,并且觉得自己已经准备好将其作为仓库的一个永久部分了,就需要使用下面的命令导入您的修改:
$ git-commit Documentation/ManagementStyle |
您会被提示说要求提供一个提交消息,它是一个用户生成的注释,用来帮助其他开发人员(也可能是您自己以后)理解刚才的实现到底进行了哪些修改。在我们的例子中,提交消息是一个描述刚才对文档所做修改的短句。
如果您希望检查一下到目前为止工作的状态,可以执行 git-log
来查看本地仓库的历史(它继承了所克隆的仓库的信息)。您的提交消息应该在日志的最上面。
回页首
添加或删除文件
但是请等一下!我们还没有添加 Documentation/Sandwiches 文件呢,因此我们需要将其添加到工作目录中,并告诉 Git 何时这个文件已经准备好了。我使用 echo
命令创建了想要添加的文件,因为这只是一个简单的例子而已。同样,您也可以使用自己喜欢的工具。
$ echo "Turkey is superior" > Documentation/Sandwiches |
现在我们已经添加了一个文件,接下来需要将这个文件添加到 Git 中,从而让 Git 了解这种变化,然后才能提交这个版本。我们可以通过执行下面的命令来完成这些任务:
$ git-add Documentation/Sandwiches $ git-commit Documentation/Sandwiches |
如果您添加了多个文件,可以在同一行中的 git-add
命令后面列出这些文件,不过您也不必一次将它们全部添加到仓库中去。如果要删除某个文件,并且没有 git-add
之类的特殊命令;您只需要删除这个文件,然后提交就可以了。
现在应该查看一下 git-log
,从而确保到现在为止所做的事情都是正确的。这一次,我们将使用 -p
选项来以单独的补丁格式查看日志。
$git-log -p |
回页首
创建 diff 文件
最后,我们希望生成一个包含您修改后的文件和原文件之间区别的文本文件。这个文件通常是使用 diff
工具创建的,因此就称为 diff 文件。diff 可以帮助我们创建补丁文件(patch file),后者是我们向很多开放源码软件项目发送代码提交时通常使用的方法。有关 diff 的更多内容,请参看下面 参考资料 部分中有关 Kernel.org 的链接。
回页首
Git 还可以干什么?
我们可以使用 Git 来管理本地仓库,而不用镜像其他人的工作。例如,如果我们喜欢使用 Git 来管理自己个人对某个开放源码项目贡献的文件,就可以从项目快照中生成一个 Git 仓库。
假设我们已经有了一个名为 release.tar.gz 的标准 release tarball,可以执行下面的命令来创建一个本地的 Git 仓库:
$ tar -zxvf release.tar.gz $ cd release $ git init-db |
我们可以看到消息说 Git 是 “默认于本地存储区域的”。这些消息都是正常的,说明我们有一个 Git 仓库。
现在我们已经对工作目录进行了初始化,接下来在项目目录中应该会看到一个新目录 .git。为了告诉 Git 我们希望对这个项目中的每个文件都进行跟踪,请执行下面的命令:
$ git add . |
最后,使用下面的命令将所监视的文件提交到仓库中:
$ git commit -a |
同样,系统会提示我们输入提交消息。从现在开始,我们就可以在自己的 Git 仓库中使用 Git 所提供的完整功能了,例如对实验特性进行分支,为了追踪回归测试问题而将代码一分为二,并使用常见的版本历史功能。
有关 Git 的分支管理和其他有趣特性的更多信息,请参看 Kernel.org 上给出的 Git 的优秀教程(参见 参考资料 中的链接)。
回页首
结束语
现在我们已经知道如何使用 Git 来获取 Linux 内核源代码和其他 Git 管理的项目了,接下来可以选择使用 Git 来管理下一个开发项目。 Git 仍然相对较新,仍然处于不断开发中。其他脚本和工具正在实现用来简化 Git 的使用;请参看 参考资料 中给出的例子。