Как получить список входящих коммитов на git push для новой ветки в хуке - PullRequest
8 голосов
/ 24 декабря 2010

Я пишу ловушку предварительного получения, чтобы выполнить некоторую проверку перед принятием коммитов на толчке. Он отлично работает с существующими ветками, так как я использую следующую команду git, чтобы получить список поступающие коммиты:

git rev-list $old_sha1..$new_sha1

Однако вышеприведенная команда завершается неудачно, если пользователь помещает новую ветку в общий репозиторий, потому что old_sha1 это все нули. Так что вопрос в том, как мне получить список входящих коммитов для вновь созданная ветка. Выполнение git rev-list $new_sha1 не работает, поскольку дает все ревизии до начала времен. Есть ли способ указать что-то вроде этого:

git rev-list $branching_sha1..$new_sha1

Ответы [ 3 ]

11 голосов
/ 26 декабря 2010

Попробуйте это:

git rev-list $new_sha1 $(git for-each-ref --format '^%(refname:short)' refs/heads/)

Используется git for-each-ref для печати известных ссылок; в --format указывает, что короткое имя будет выводиться вместе с предыдущей кареткой; и говорит refs/heads/ о выборе только местных руководителей. В итоге вы запускаете что-то вроде этого:

git rev-list $new_sha1 ^master ^foo ^bar ^baz

Символ каретки означает «исключить коммиты, достижимые отсюда». Так что это даст вам все коммиты, которые доступны с $new_sha1, но не с любого из существующих ссылок.

Для одновременной обработки случаев new-ref и существующих-ref вы можете использовать поддержку массивов bash:

if ! [ $old_sha1 = 0000000000000000000000000000000000000000 ] ; then
    excludes=( ^$old_sha1 )
else
    excludes=( $(git for-each-ref --format '^%(refname:short)' refs/heads/) )
fi

git rev-list $new_sha1 "${excludes[@]}"
2 голосов
/ 20 января 2016

Проще говоря, вы можете использовать это:

git rev-list $new_sha1 --not --all

Это тот же принцип, что и в ответ Аристотеля Пагальциса , но он просто использует встроенные в rev-list опции (которые, я думаю, были добавлены после того, как этот вопрос был ответил ...).
Параметр --all эквивалентен части for-each-ref: он добавляет все известные ссылки в аргументы команды. Параметр --not, в данном конкретном случае, подобен добавлению префикса ^ ко всем ссылкам, добавленным --all.
Таким образом, эта команда будет печатать коммиты, достижимые из нового SHA1, за исключением всех коммитов, доступных из известных (т.е. уже отправленных) ссылок.

1 голос
/ 14 июля 2015

Следующее помогло в моем случае. Я лично думаю, что это очень просто.

OLD_REV=$2
NEW_REV=$3

if [ $OLD_REV == "0000000000000000000000000000000000000000" ]; then
    OLD_REV=$(git merge-base master $NEW_REV)
fi;

git diff --name-only $OLD_REV $NEW_REV
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...