41.5 Git评注
41.5.1 评注的奥秘
文字评注。
在第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