无法复制提交的Pro Git构造

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法复制提交的Pro Git构造相关的知识,希望对你有一定的参考价值。

我正在构建自己的Git实现,并且达到了我的输出(以及git本身的输出)与Pro Git的输出产生歧义的程度。

具体来说,现在我正在按照https://git-scm.com/book/en/v2/Git-Internals-Git-Objects的构造来构建提交。但是,即使修复了提交数据的全部内容,我似乎也无法获得相同的提交哈希。我写了一个小程序来写出并读入提交,该程序能够往返我指定的提交数据,但是它得到了“错误的”提交哈希。该“错误的”提交哈希与我的本地git一致,但与Pro Git的打印输出不一致。

为了方便起见,在zsh中复制了它(当我使用自己的Git实现时,我得到的提交散列与git完全相同):

➜  git --version
git version 2.26.1 
➜  rm -rf .git
➜  export GIT_AUTHOR_DATE="2009-05-22T18:09:34+00:00-0700"
export GIT_AUTHOR_EMAIL="schacon@gmail.com"
export GIT_AUTHOR_NAME="Scott Chacon" \
export GIT_COMMITTER_DATE="2009-05-22T18:09:34+00:00-0700" \
export GIT_COMMITTER_EMAIL="schacon@gmail.com" \
export GIT_COMMITTER_NAME="Scott Chacon" \

git init

# First commit.
echo 'version 1' > test.txt
git add test.txt
echo 'First commit' | git commit -F -
Initialized empty Git repository in /Users/Patrick/Documents/Experiments/foo2/.git/
[master (root-commit) 70d4408] First commit
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

➜  git cat-file -p 70d440
tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
author Scott Chacon <schacon@gmail.com> 1243040974 -0700
committer Scott Chacon <schacon@gmail.com> 1243040974 -0700

First commit
➜

相反,斯科特从书中输出的是:

$ echo 'First commit' | git commit-tree d8329f
fdf4fc3344e67ab068f836878b6c4951e3b15f3d

$ git cat-file -p fdf4fc3
tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
author Scott Chacon <schacon@gmail.com> 1243040974 -0700
committer Scott Chacon <schacon@gmail.com> 1243040974 -0700

First commit

[请注意,从本书的输出中可以看到的数据相同,但是提交哈希不同(我的是70d44,斯科特的是fdf4f)。

为什么我们会有不同的哈希值?这可能与zlib压缩级别的变化有关吗?这似乎是这里唯一可能的变量,但是无论我使用的zlib压缩级别如何,我的结果都保持不变(因为更改此功能的能力暴露于.NET的Ionic.Zlib)。一种可能的解释是,自本书编写以来,zlib发生了变化,而zlibIonic.Zlib本身在2.26.1版本中都使用了更新的git。但它并没有totally更改,因为到目前为止,我为已经尝试过的树和Blob对象获得了正确的哈希值。

我对行尾非常小心:我的提交消息的末尾和换行符的末尾都有换行符,因为两者均来自echo。无论如何,我对我的结果充满信心:我可以使用我自己的Git实现来回提交,而我自己的Git实现也同意我的git(而不是Scott)。

答案

感谢@torek,我想到了回顾Git书的历史。这确实是一个错误:他们更改了提交消息而没有相应地更改哈希。这个特定的提交消息曾经是“第一次提交\ n”(注意大小写);至少从https://github.com/progit/progit2/blob/fbb758a2369bcb02bbd8683a6a76e24e41b8e63c/book/10-git-internals/sections/objects.asc开始,这是正确的。该问题是由4f55250d90710652c0948853bb3ffcbd751adeee引入的,我现在将对其进行修复。

以上是关于无法复制提交的Pro Git构造的主要内容,如果未能解决你的问题,请参考以下文章

如何从 git 跟踪中删除文件? [复制]

无法在 git 标签中提交

git gui提交无法获知你的身份

git 无法提交空目录

git无法下载需要授权的文件

Mac下使用Sourcetree无法识别文件夹