Невозможно воспроизвести Pro Git конструкцию коммита - PullRequest
0 голосов
/ 03 мая 2020

Я строю свою собственную реализацию 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 (а не со Скоттом) в этом.

1 Ответ

0 голосов
/ 03 мая 2020

Благодаря @torek я подумал о том, чтобы оглянуться назад по истории Git книги. Это действительно ошибка: они изменили сообщение коммита без соответствующего изменения хэшей. Это конкретное сообщение фиксации раньше было «первый коммит \ n» (примечание заглавными буквами); это было верно по крайней мере на https://github.com/progit/progit2/blob/fbb758a2369bcb02bbd8683a6a76e24e41b8e63c/book/10-git-internals/sections/objects.asc. Проблема была введена 4f55250d90710652c0948853bb3ffcbd751adeee, и я исправлю ее сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...