Проверить, существует ли фиксация
Как проверить, существует ли фиксация с заданным sha в текущей ветке?
Существует много способов разобрать выходы, но мне нужен оптимальный способ, который возвращает логическое значение (для использования в bash script).
например.
sha=$1
if [ -z `git magic --validate $sha` ]; then
echo "Invalid commit sha: $sha"
exit 1
fi
Ответы
Ответ 1
Метод rev-list | grep
работает нормально; там крошечный бит накладных расходов, потому что git должен распечатать все SHA1 для grep
, чтобы увидеть, но это не очень важно.
Вы также можете сделать это с помощью git merge-base
, если хотите - если база слияния целевого фиксации и ветвь является целевым фиксацией, ветвь содержит целевую фиксацию:
if [ "$(git merge-base $commit $branch)" = "$commit" ]; then
...
fi
В любом случае, сделайте это, обратите внимание, что rev-list
и merge-base
будут печатать SHA1, поэтому, если фиксация, которую вы тестируете для включения, называется веткой или тегом, вы захотите использовать git rev-parse
, чтобы сначала включить его в SHA1.
Ответ 2
git rev-parse --quiet --verify <commit>
На самом деле не проверяется, что фиксация (я предполагаю, что SHA1 - это то, что имеется в виду) существует. Он проверяет наличие в базе данных объекта, соответствующего предоставленному SHA1. То есть, если есть объект blob или tree, который соответствует SHA1, он сообщит, что он существует, даже если он не является фиксацией.
git rev-parse --quiet --verify <sha1>^{commit}
Это проверит, существует ли объект и что он является объектом, который может использоваться как фиксация (фиксация или аннотированный тег).
Ответ 3
Вы можете посмотреть вывод
git rev-list HEAD..$sha
Если эта команда завершилась неудачно, потому что sha1 вообще не существует в репозитории, код выхода будет отличным от нуля. Если выход пуст, фиксация находится в текущей ветке, и если она не пуста, это не так. Таким образом, ваш script будет выглядеть как
if revlist=`git rev-list HEAD..$sha 2>/dev/null` && [ -z "$revlist" ]; then
:
fi
Если вы уже знаете, что $sha
действительно называет фиксацию (как хэш SHA1 или любым другим способом), это упрощает
if [ -z "`git rev-list HEAD..$sha`" ]; then
:
fi
Ответ 4
git merge-base --is-ancestor $sha HEAD
Это проверяет, если $sha
является фиксацией предка для текущей ветки (HEAD
) и успешно завершается, если она есть.
В вашем примере
sha=$1
if ! git merge-base --is-ancestor $sha HEAD; then
echo "Invalid commit sha: $sha"
exit 1
fi
Ответ 5
git rev-list branch-youre-interested-in | grep -q sha-youre-interested-in
Вы можете использовать код выхода из grep в условных выражениях.
Для текущей ветки
git rev-list HEAD | grep -q sha-youre-interested-in
Ответ 6
git cat-file печатает информацию об объектах в репозитории. "-e" проверяет, действительно ли объект действителен и выходит с 0-статусом, а когда недействительно существует с 1.
git cat-file -e 3d68db1028afe27a0055c2234f98fc945b1958f5
echo $?
1