Я строю свою собственную реализацию Git и достиг точки, в которой мой результат (и результат git
) отклонился от Pro Git.
В частности, сейчас я строю коммит в https://git-scm.com/book/en/v2/Git-Internals-Git-Objects. Но я не могу вывести тот же коммит с sh, даже после исправления всего содержимого данных коммита. Я написал небольшую программу для записи и чтения в коммитах, и эта программа способна обойти указанные мной данные коммита, но она получает «неправильный» коммит ha sh. Этот «неправильный» коммит ha sh соответствует моему локальному git
, но не печатному выводу Pro Git.
Воспроизведение этого в zsh для удобства (я получаю точно то же самое commit ha sh, как здесь делает 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
Обратите внимание, что у меня есть те же данные, которые можно наблюдать из вывода книги, но другой коммит ha sh (у меня 70d44, у Скотта fdf4f).
Почему у нас разные хэши? Возможно, это связано с изменением уровня сжатия zlib? Это кажется единственно возможной переменной здесь, но мои результаты остаются неизменными независимо от уровня сжатия zlib, который я использую (поскольку возможность изменять это зависит от NET Ionic.Zlib
). Одно из возможных объяснений состоит в том, что zlib
изменилось с момента написания книги, и более поздняя версия zlib
используется как Ionic.Zlib
, так и самой git
в версии 2.26.1; но оно не изменилось полностью , потому что я получил правильные хэши для объектов дерева и объектов, которые я пробовал до сих пор.
Я очень внимательно относился к окончанию строк: мой В сообщении коммита есть новая строка в конце, как и у Скотта, потому что обе строки приходят от echo
. В любом случае, я уверен в своем результате: я могу совершать двусторонние коммиты, используя мою самодельную реализацию Git, и моя самодельная реализация Git согласуется с моим git
(а не со Скоттом) в этом.