Как ссылаться на начальный коммит?

131

У меня есть сценарий, который должен ссылаться на начальную фиксацию в репозитории. git имеет специальную ссылку HEAD, но не имеет соответствующего TAIL. Я не могу найти в этом ничего, git help rev-parseчто могло бы мне помочь.

Вот что я хотел бы сделать:

git show TAIL

Вот один из вариантов:

git show `git log --reverse | if read a commit ; then echo $commit ; fi`

Это довольно взломано и зависит от того, что вывод журнала git не меняется.

Прямо сейчас я просто помечаю начальную фиксацию и использую ее в качестве своей ссылки. Однако я бы хотел выпустить общий инструмент, так что это не лучший вариант.

Брайан Ларсен
источник

Ответы:

151

Не используйте git-log для написания сценариев: используйте либо git-rev-list, либо git-logс указанным настраиваемым форматом ( --format=*<sth>*опция).

Существует дополнительная проблема с вашим вопросом: в репозитории может существовать более одного такого корневого коммита TAIL (без родительского коммита) (даже если мы не принимаем во внимание отключенные ветки, такие как 'html', 'man' и 'todo' в git.git хранилище). Обычно это результат объединения отдельных проектов в один или объединения поддеревьев отдельно разработанного подпроекта.

Например, в репозитории git есть 6 корневых коммитов: git-gui, gitk (объединено поддеревьев), gitweb (объединено, больше не разрабатывается отдельно), инструменты почты git (объединены очень рано в истории проекта) и p4-fast-export ( возможно случайно). Это не считая корней веток 'html' и 'man', ветвей 'удобства', которые содержат предварительно сгенерированную документацию, и ветки 'todo' со списком TODO и скриптами.


Если у вас git 1.7.4.2 или новее, вы можете использовать --max-parentsопцию:

$ git rev-list --max-parents=0 HEAD

В противном случае вы можете получить список всех без родительских (корневых) коммитов, доступных из текущей ветки, используя:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Якуб Наребски
источник
Для меня git rev-list HEAD | tail -n 1и git rev-list --max-parents=0 HEADне возвращают для меня одно и то же хэш-значение. Тот, кто использует, --max-parents=0фактически получает первоначальную фиксацию. Просто подумал, что отмечу, что последнее кажется более надежным.
jbranchaud
1
@Treebranch: это может произойти, если у вас есть коммиты с нечетными отметками времени. добавление --topo-orderк rev-listдолжно исправить это, хотя я думаю, что --max=parents=0ответ будет лучшим.
jth
35

git rev-list HEAD | tail -n 1 более стабильный вариант.

Роберт Мунтяну
источник
14
Это вернет одну из хвостовых коммитов; может быть более одного корневого (без родителей) коммитов
Якуб Наребски
Этот ответ работал отлично и вернул только одну фиксацию sha, тогда как git rev-list --max-parents=0 HEADвернул 3 фиксации.
protoEvangelion
tail также не является командой, которая по умолчанию присутствует в Windows, но работает в GitBash в Windows. :)
Johny Skovdal