Попробуйте это:
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[@]}"