Как ссылаться на начальный коммит?
У меня есть скрипт, который должен ссылаться на первоначальный коммит в репозитории. 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 принимают --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