Подтвердить что ты не робот

Получить список дочерних коммиттов определенного коммита в Git

Мне было интересно, есть ли эффективный способ извлечения детей данного коммита. Хотя метод обсуждался в Ссылка на дочерний элемент фиксации в Git, он очень неэффективен.

Я думал, что это будет простое дело в Git, но, по-видимому, это не так.

С уважением.

4b9b3361

Ответ 1

git rev-list могут показывать детей, но эти дети должны быть доступны из предоставленных вами коммитов. Предполагая, что вы хотите показать всех детей, доступных из всех веток вашего репо, вы можете использовать что-то вроде

git rev-list --all --not $COMMIT^@ --children | grep "^$COMMIT"

Это должно выводить строку, которая выглядит как

$COMMIT $child1 $child2 $child3 ...

Для удобства вы можете добавить эту команду в псевдоним git:

children = "!f() { git rev-list --all --not $1^@ --children | grep $(git rev-parse $1); }; f" # reachable children of a ref

Синтаксис $COMMIT^@ может быть путаным, поэтому я объясню это. Надеюсь, $COMMIT не требует пояснений. Затем следует ^@, который расширяется для всех родителей ссылочной фиксации. Поэтому $COMMIT^@ означает "все родители $COMMIT". Поскольку это следует за флагом --not, это указывает rev-list прекратить обработку после того, как он удалит любого родителя $COMMIT. Это, по сути, просто оптимизация, потому что любое достижение, достигаемое из $COMMIT, не может быть дочерним.


Примечание: предыдущая версия этого ответа указала tail -1 вместо grep "^$COMMIT". Это может работать в простом тестовом репо (именно поэтому я изначально сказал это), но нет гарантии, что git rev-list будет выдавать $COMMIT last, если у вас есть ветки, которые не содержат $COMMIT.

Ответ 2

Я использую следующий псевдоним (на основе @Kevin Ballard answer:

# Get all children of current or specified commit-ish
children = "!bash -c 'c=${1:-HEAD}; set -- $(git rev-list --all --not \"$c\"^@ --children | grep $(git rev-parse \"$c\") ); shift; echo $*' -"
  • Без аргумента - все дочерние элементы HEAD
  • С помощью commit-ish - все дочерние элементы этого объекта