2016-06-13 11 views
1

В своем pre-commit hook git, похоже, проверяется, что HEAD существует. Если это не так, по умолчанию используется специальный хэш пустого дерева для сравнения индекса.Почему git's pre-commit hook подтверждает, что HEAD существует?

if git rev-parse --verify HEAD >/dev/null 2>&1 
then 
     against=HEAD 
else 
     # Initial commit: diff against an empty tree object 
     against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 
fi 

Хеш по умолчанию является специальным хэшем. Я прочитал, что я мог бы получить его через

git hash-object -t tree < /dev/null 

against позже используется как это

# If there are whitespace errors, print the offending file names and fail. 
exec git diff-index --check --cached $against -- 

Почему крюк сделать это? В каких ситуациях я могу выполнить фиксацию, но HEAD будет недействительным?

ответ

1

HEAD всегда указывает на текущий фиксации, потому что:

  • он содержит имя текущей ветви (например, ref: refs/heads/master), или
  • он указывает непосредственно к фактической фиксации ID (а «отсоединенный HEAD»), так что он содержит сырую SHA-1 хэш-строку.

Если HEAD содержит необработанное значение хеш-функции, то HEAD, безусловно, действительно, потому что он должен указывать на реальные фиксации. Но ... что происходит в совершенно новом, пустом хранилище?

Вы находитесь на ветке master, поэтому HEAD читает ref: refs/heads/master. Но каков кончик ветки master? Какой идентификатор фиксации хранится в master?

В репозитории нет коммитов. Где вы сделаете master баллов?

Решение Git этой проблемы состоит в том, чтобы сохранить master недействительным. Вот когда git rev-parse --verify HEAD не удается: HEAD говорит master, но master еще не существует.

Внутренне, Git относится к этому как «неродившаяся ветвь», а иногда и «сиротская ветвь». Использование git checkout --orphan newbranch ставит Git в это же состояние для вновь созданного (за исключением того, что он на самом деле не создан еще) branch newbranch. Ссылка HEAD теперь содержит ref: refs/heads/newbranch, но до сих пор нет newbranch. Таким образом, каждое состояние unborn-branch похоже на это, но есть один конкретный, который вы видите каждый раз при создании нового пустого хранилища.

 Смежные вопросы

  • Нет связанных вопросов^_^