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

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

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

git show TAIL

Вот один вариант, который у меня есть:

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

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

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

6 ответов

Решение

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

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

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


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

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

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

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

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

Не уверен, что вы здесь пытаетесь сделать, но некоторые команды git принимают --root как вариант, чтобы ссылаться на корень дерева фиксации, например

git rebase --interactive --root main

Предполагая, что первый родитель слияния является основной линией разработки:

      git rev-list --reverse --topo-order --first-parent HEAD | sed 1q

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

      git rev-list --all --max-parents=0

или

      git rev-list --reflog --max-parents=0

Но если требуется найти корневые коммиты, в том числе недоступные,git fsckможет быть использован:

      git fsck --root --no-dangling

The --no-danglingПараметр подавляет предупреждающие сообщения о висячих фиксациях, упрощая обработку вывода в сценариях.

Чтобы получить первую фиксацию в репозитории, выполните эту команду:

       git rev-list --oneline HEAD | tail -n 1
Другие вопросы по тегам