Как получить хеш дерева рабочей копии в git? - PullRequest
1 голос
/ 02 ноября 2019

С помощью git, как я могу получить хэш дерева текущего состояния каталога git? То есть, какой хэш дерева коммита (не хеш коммита) был бы, если бы я запустил git add -A, а затем git commit?

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Несколько проще, чем метод Грега Бэкона :

  • создать временный индекс путем копирования текущего индекса
  • , использовать git add -A для обновления всего во временномindex
  • используйте git commit-tree, чтобы превратить временный индекс в фактическое дерево

, для которого достаточно небольшого сценария оболочки (непроверенного):

#! /bin/sh -e
export GIT_INDEX_FILE=$(mktemp)
trap "rm -f $GIT_INDEX_FILE" 0 1 2 3 15
cp $(git rev-parse --git-dir)/index $GIT_INDEX_FILE
git add -A && git write-tree

причина для копирования текущего индекса заключается в том, что файлы, которые могут быть проигнорированы (через .gitignore или исключающий файл), которые в настоящее время отслеживаются (в обычном индексе), будут игнорироваться при использовании временного индекса, если мы не заполнили временный индексиз реального индекса.

См. также ваш собственный вопрос Как получить хэш дерева индекса в git?

1 голос
/ 02 ноября 2019

Вы можете попытаться собрать его вместе с git hash-object и git mktree, как описано в главе Raw Git в The Git CommunityКнига , но я предлагаю более простой подход к выполнению всей работы с одноразовым HEAD.

Если вы хотите начать с кончика текущей ветви, перейдите в состояние detached HEAD с

git checkout $(git rev-parse HEAD)

Часть болтливого вывода из git checkout намекает на преимущество в том, что вы делаете это таким образом.

Вы находитесь в состоянии «отсоединенный ГОЛОВ». Вы можете осмотреться, внести экспериментальные изменения и зафиксировать их, а также отменить любые коммиты, которые вы делаете в этом состоянии, не влияя на какие-либо ветви, выполнив другую проверку.

Здесь я создаю новые файлы, которые дают gitчто-то сделать, и это представляет ваши реальные изменения с помощью

touch new other stuff blah etc

Теперь, вместо того, чтобы переопределять git, позвольте git делать то, что он уже делает

git add -A .

На этом этапе изменения индекса,из которого git write-tree с радостью создаст новый объект дерева. Вывод на вашем компьютере в вашем хранилище - это хеш, о котором вы спрашивали.

git write-tree
afba5669cbf579a9f27f1fda66cb0958282fae3a

Хеш, записанный в стандартный вывод, - это хеш только что созданного объекта дерева, но в этом нет необходимости. поверьте мне на слово.

$ git commit -m 'Throwaway commit'
[detached HEAD 0ae9d12] Throwaway commit
 5 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 blah
 create mode 100644 etc
 create mode 100644 new
 create mode 100644 other
 create mode 100644 stuff

Вывод намекает на имя объекта SHA1 нового коммита (0ae9d12), которое мы можем подтвердить с помощью

$ git rev-parse HEAD
0ae9d12408d1ea7eb02821d66f6de8a2f8423e7f

Но вы хотите знатьхэш объекта коммита дерево , адресуемый с помощью

$ git rev-parse HEAD^{tree}
afba5669cbf579a9f27f1fda66cb0958282fae3a

Обратите внимание, что хэш идентичен выводу из git write-tree.

Теперь, если вы хотите сохранитькоммит, создайте новую ветку здесь с git branch. В противном случае, если вы проигнорируете это, коммит и неиспользуемые объекты будут в конечном итоге отброшены как часть обычной сборки мусора в git.

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