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

Проверить, существует ли фиксация

Как проверить, существует ли фиксация с заданным sha в текущей ветке?

Существует много способов разобрать выходы, но мне нужен оптимальный способ, который возвращает логическое значение (для использования в bash script).

например.

sha=$1
if [ -z `git magic --validate $sha` ]; then
  echo "Invalid commit sha: $sha"
  exit 1
fi
4b9b3361

Ответ 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