41.5 Git评注

    空标题文档 - 图1

    41.5.1 评注的奥秘

    空标题文档 - 图2

    文字评注。

    在第2篇第11章的“11.4.6二分查找”中用到的gitdemo-commit-tree版本库实际上就包含了提交评注,只不过之前尚未将评注获取到本地版本库而已。如果工作区中的gitdemo-commit-tree版本库已经不存在了,可以使用下面的命令从Github上再克隆一个:


    $git clone-q git://github.com/ossxp-com/gitdemo-commit-tree.git $cd gitdemo-commit-tree

    执行下面的命令,查看最后一次提交的提交说明:


    $git log-1 commit 6652a0dce6a5067732c00ef0a220810a7230655e Author:Jiang Xin<jiangxin@ossxp.com> Date:Thu Dec 9 16:07:11 2010+0800 Add Images for git treeview. Signed-off-by:Jiang Xin<jiangxin@ossxp.com>

    下面为默认的origin远程版本库再添加一个引用获取表达式,以便在执行git fetch命令时能够同步评注相关的引用。命令如下:


    $git config—add remote.origin.fetch refs/notes/:refs/notes/

    执行git fetch会获取到一个新的引用refs/notes/commits,如下:


    $git fetch remote:Counting objects:6,done. remote:Compressing objects:100%(5/5),done. remote:Total 6(delta 0),reused 0(delta 0) Unpacking objects:100%(6/6),done. From git://github.com/ossxp-com/gitdemo-commit-tree *[new branch]refs/notes/commits->refs/notes/commits

    当获取新的评注相关的引用之后,再来查看最后一次提交的提交说明。下面的命令输出中,提交说明的最后两行就是附加的提交评注。


    $git log-1 commit 6652a0dce6a5067732c00ef0a220810a7230655e Author:Jiang Xin<jiangxin@ossxp.com> Date:Thu Dec 9 16:07:11 2010+0800 Add Images for git treeview. Signed-off-by:Jiang Xin<jiangxin@ossxp.com> Notes: Bisect test:Bad commit,for doc/B.txt exists.

    附加的提交评注来自于哪里呢?显然应该和刚刚获取到的引用相关。查看一下获取到的最新引用,会发现引用refs/notes/commits指向的是一个提交对象。


    $git show-ref refs/notes/commits 6f01cdc59004892741119318ceb2330d6dc0cef1 refs/notes/commits $git cat-file-t refs/notes/commits commit

    既然新获取的评注引用是一个提交对象,那么就应该能够查看评注引用的提交日志:


    $git log—stat refs/notes/commits commit 6f01cdc59004892741119318ceb2330d6dc0cef1 Author:Jiang Xin<jiangxin@ossxp.com> Date:Tue Feb 22 09:32:10 2011+0800 Notes added by 'git notes add' 6652a0dce6a5067732c00ef0a220810a7230655e|1+ 1 files changed,1 insertions(+),0 deletions(-) commit 9771e1076d2218922acc9800f23d5e78d5894a9f Author:Jiang Xin<jiangxin@ossxp.com> Date:Tue Feb 22 09:31:54 2011+0800 Notes added by 'git notes add' e80aa7481beda65ae00e35afc4bc4b171f9b0ebf|1+ 1 files changed,1 insertions(+),0 deletions(-)

    从上面的评注引用的提交日志可以看出,存在两次提交,并且从提交说明可以看出是使用git notes add命令添加的。至于每次提交添加的文件却很让人困惑,所添加文件的文件名居然是40位的哈希值。

    您当然可以通过git checkout-b命令检出该引用来研究其中所包含的文件,不过也可以运用我们已经学习到的Git命令直接对其进行研究。

    用git show命令显示目录树。


    $git show-p refs/notes/commits^{tree} tree refs/notes/commits^{tree} 6652a0dce6a5067732c00ef0a220810a7230655e e80aa7481beda65ae00e35afc4bc4b171f9b0ebf

    用git ls-tree命令查看文件大小及对应的blob对象的SHA1哈希值。


    $git ls-tree-l refs/notes/commits 100644 blob 80b1d2…47 6652a0… 100644 blob e894f2…56 e80aa7…

    文件名既然是一个40位的SHA1哈希值,那么文件名一定有意义,通过下面的命令可以看到文件名包含的40位哈希值实际对应于一个提交。


    $git cat-file-p 6652a0dce6a5067732c00ef0a220810a7230655e tree e33be9e8e7ca5f887c7d5601054f2f510e6744b8 parent 81993234fc12a325d303eccea20f6fd629412712 author Jiang Xin<jiangxin@ossxp.com>1291882031+0800 committer Jiang Xin<jiangxin@ossxp.com>1291882892+0800 Add Images for git treeview. Signed-off-by:Jiang Xin<jiangxin@ossxp.com>

    用git cat-file命令查看该文件的内容,可以看到其内容就是附加在相应提交上的评注。


    $git cat-file-p refs/notes/commits:6652a0dce6a5067732c00ef0a220810a7230655e Bisect test:Bad commit,for doc/B.txt exists.

    综上所述,评注记录在一个blob对象中,并且以所评注对象的SHA1哈希值命名。因为对象SHA1哈希值的唯一性,所以可以将评注都放在同一个文件系统下而不会相互覆盖。针对这个包含所有评注的、特殊的文件系统的更改被提交到一个特殊的引用refs/notes/commits当中。

    [1]https://github.com/ossxp-com/gitdemo-commit-tree/commit/6652a0dce6a5067732c00ef0a220810a7230655e