你真的不能按照你展示的方式做到这一点。问题归结为笔记的工作方式。正如mart1n 在评论中建议的那样,您需要先推送笔记,或者同时推送。原因如下:
笔记的工作原理
如果出现以下情况,则存在“附加到”提交的注释(因此可以通过git log
和显示git show
)“现在”:
- 假设这个提交的 SHA1(我们试图找到它的注释)是
1234567...
.
refs/notes/commits
存在,并且
- 通过指向的提交读取
refs/notes/commits
,有一个文件名匹配的“文件” 1234567...
。
注释是具有有趣名称的文件的内容。
让我们探索查找笔记的过程。
背景,使用低级“原始”git 命令
大多数 repo 的最低级别访问命令是git cat-file
. 这使您可以查看存储库中任何对象的类型 ( ) 和内容 ( )。这里的sha1部分可以是任何 git 引用名称,只要它解析为那些 40 个字符的十六进制 SHA-1 值之一。notes 的默认引用名称是, 并且(如果存在)它应该始终指向一个对象。因此:git cat-file -t sha1
git cat-file -p sha1
refs/notes/commits
commit
$ git cat-file -p refs/notes/commits
tree 28db2757c2b7c6e4bbfef35e61e8bd7c698626dc
parent ce97e80bfbdab9bc163ecb93779d071d7ed8c739
author A U Thor <author@example.example> 1376652910 -0600
committer A U Thor <author@example.example> 1376652910 -0600
Notes added by 'git notes edit'
我们的下一步将是查看tree
此处的名称:
$ git cat-file -p 28db2757c2b7c6e4bbfef35e61e8bd7c698626dc
对于一组简短的注释,这产生了几乎与我们将在下面看到的相同的东西。如果有很多注释,这会导致更多tree
的 s,而这些 s 又可以有更多的子树,所以这很痛苦。有一个更简单的方法。
获取笔记
要查看当前注释是什么(如果有),请使用git notes list
:
$ git notes list
b9458a531c3f93bd36af0025d56029ef58cf8d00 5e013711f5d6eb3f643ef562d49a131852aa4aa1
1c716d4d58325651ceecba14ce8974b0ac6d13e9 a546ad9299465c9cf304fecf01d1514337419e2f
“笔记内容”使用每行左侧的 SHA-1,每个笔记内容文件都附加到SHA-1 在右侧的提交1 。让我们使用第一行来看看它是如何工作的:
$ git cat-file -t 5e013711f5d6eb3f643ef562d49a131852aa4aa1
commit
$ git cat-file -p 5e013711f5d6eb3f643ef562d49a131852aa4aa1
tree ead5cc295ae64c9186f392b80ca4ed10888f20d9
parent 309b36c8166f5ff330a6e8a0a674ed161d45b5f4
author ...[line snipped]
committer ...[line snipped]
add ast ... [rest snipped]
当然,您可以通过git show 5e0137
或git log -1 5e0137
等方式查看该提交,这也会向您显示注释内容。但是,要仅查看原始笔记内容,请使用左侧的 SHA-1:
$ git cat-file -p b9458a531c3f93bd36af0025d56029ef58cf8d00
experiment: add a note
this is the text I put in the note
让我们做一个git notes edit 5e0137
并更改提交的注释,然后git notes list
再次:
$ git notes edit 5e0137
[editor session snipped]
$ git notes list
d87650a968ff684e69175eacde0880595f9f2989 5e013711f5d6eb3f643ef562d49a131852aa4aa1
1c716d4d58325651ceecba14ce8974b0ac6d13e9 a546ad9299465c9cf304fecf01d1514337419e2f
右边的两个“文件名”还是完全一样的,但是左边的第一个SHA1不同。让我们看一下:
$ git cat-file -p d87650a968ff684e69175eacde0880595f9f2989
change some stuff in the note
I edited the note attached to 5e0137.
如果您现在git show
(git log
等)旧注释附加到的提交,您将获得新注释。实际上,它们的作用是运行git notes list
,检查右侧的匹配 ID,如果找到,git cat-file -p
则检查左侧的 ID(重新格式化/缩进)。(当然,这是一个更优化的版本。)
这种在列表中查找提交 ID 的机制notes
是注释可以更改的原因。
在该“分支”下的添加/更改文件下添加新提交refs/notes/commits
(它不是真正的分支,分支以 开头refs/heads/
,但它就像一个分支)。新文件具有适用于现有(旧)提交的新注释。那些旧的提交根本没有改变,但是当git log
查看git show
注释以查看提交 ID 是否在其中时,它们会得到新的、不同的注释来显示相同的旧提交。
但是,由命名的提交对象refs/notes/commits
现在必须存在,并且必须指向您希望看到的附在您所询问的提交上的注释。如果您push
对某个远程存储库进行了一堆新提交,并且尚未push
编辑该refs/notes/commits
提交,那么在远程存储库上查看的任何内容都看不到您的注释,因为它们根本不存在。先推送笔记,或者同时推送,它们就会在那里找到。
1实际上,注释可以列出任何SHA-1:提交对象、blob 对象、带注释的标记对象,甚至是树对象。您甚至可以输入与 repo 中的任何对象都不对应的 SHA-1 值,如果您愿意,可以输入“分离注释”。我知道这种东西没有用处,但没有技术原因无法完成。[编辑添加:git notes
不会这样做;我的意思是你可以用 git 管道命令来做到这一点。不过我没试过。]
怪事
自然,refs/notes/commits
它本身就是一个常规的提交树。因此,我们可以“回到过去”并查看最近的笔记之前的样子git notes edit
。但是似乎没有“前端”接口。我试过了,例如:
$ git log -1 --notes=refs/notes/commits^ 5e0137
但这根本没有显示任何注释,这看起来很奇怪/损坏,因为--notes=refs/notes/commits
有效。