Подтвердить, если коммит существует - PullRequest
14 голосов
/ 08 ноября 2010

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

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

, например

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

Ответы [ 6 ]

18 голосов
/ 19 февраля 2014
git rev-parse --quiet --verify <commit>

На самом деле не проверяет, существует ли фиксация (я думаю, SHA1 - это то, что имеется в виду).Он проверяет, что в базе данных есть объект, соответствующий предоставленному SHA1.То есть, если существует объект BLOB или дерева, соответствующий SHA1, он сообщит, что он существует, даже если он не является коммитом.

git rev-parse --quiet --verify <sha1>^{commit}

Это позволит проверить, существует ли объект и что онэто объект, который можно использовать в качестве коммита (коммит или аннотированный тег).

4 голосов
/ 09 ноября 2010

Метод 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.

4 голосов
/ 09 ноября 2010

Вы можете посмотреть на вывод

git rev-list HEAD..$sha

Если эта команда не выполнена из-за того, что sha1 вообще не существует в репозитории, код выхода будет ненулевым. Если выходные данные пусты, фиксация находится в текущей ветви, а если она не пуста, это не так. Таким образом, ваш сценарий будет выглядеть как

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
2 голосов
/ 07 сентября 2015
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
2 голосов
/ 18 августа 2015

git cat-file печатает информацию об объектах в хранилище.«-e» проверяет, является ли объект действительным и выходит со статусом 0, а когда недействительный существует с 1.

git cat-file -e 3d68db1028afe27a0055c2234f98fc945b1958f5
echo $?
1
1 голос
/ 09 ноября 2010
git rev-list branch-youre-interested-in | grep -q sha-youre-interested-in

Вы можете использовать код выхода из grep в условных выражениях.

Для текущей ветки,

 git rev-list HEAD | grep -q sha-youre-interested-in
...