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

Как проверить, существует ли коммит в репозитории Git по SHA-1

В аналогичной теме Подтвердить, если фиксация существует, они рекомендуют:

git rev-list HEAD..$sha

Если он выходит без кода ошибки, чем фиксация существует.

Но достаточно ли это достаточно для проверки?

Я думал об этом варианте:

git cat-file commit $sha

Правильно ли это для моей задачи и есть ли другие идеи?

4b9b3361

Ответ 1

Вы можете просто запустить git cat-file -t $sha и проверить, что он возвращает "commit". Вы правы, вам не нужно на самом деле печатать фактический объект для этого...

Я не уверен на 100%, что то, что происходит за сценой, более эффективно.

test $(git cat-file -t $sha) == commit

Ответ 2

git cat-file -e $sha^{commit}

Из git cat-file docs:

   -e
      Suppress all output; instead exit with zero status if <object> exists
      and is a valid object.

Это (1) показывает, что это предполагаемый прецедент для cat-file и (2) позволяет избежать ресурсов фактического вывода любого содержимого фиксации.

Добавление ^{commit} гарантирует, что объект является фиксацией (т.е. не деревом или блобом), или, как указывает ремар, - разрешает коммит.

Например,

if git cat-file -e $sha^{commit}; then
  echo $sha exists
else
  echo $sha does not exist
fi

Ответ 3

Если вы уверены, что sha совершает, то cat-file -e может использоваться, например:

if git cat-file -e $sha 2> /dev/null 
then 
  echo exists 
else 
  echo missing 
fi

Это довольно эффективно, поскольку это встроенный и не делает ничего, кроме проверки шага:

return !has_sha1_file(sha1);

В противном случае, если неясно, что sha являются объектами commit, вам нужно будет определить тип, как и с другим ответом, используя git cat-file -t. Это немного менее результативно, так как git должен искать информацию о файле. Это не так дорого, как распаковка всего файла.

Ответ 4

Вы можете запустить

git show sha

и проверьте код выхода.

Ответ 5

git rev-parse -q --verify "$sha^{commit}" > /dev/null

Из документации git rev-parse:

   --verify
       Verify that exactly one parameter is provided, and that it can be turned into a raw 20-byte SHA-1 that can be used to access the object database. If so, emit it to the standard output; otherwise, error out.

       If you want to make sure that the output actually names an object in your object database and/or can be used as a specific type of object you require, you can add the ^{type} peeling operator to the parameter. For
       example, git rev-parse "$VAR^{commit}" will make sure $VAR names an existing object that is a commit-ish (i.e. a commit, or an annotated tag that points at a commit). To make sure that $VAR names an existing object of
       any type, git rev-parse "$VAR^{object}" can be used.

   -q, --quiet
       Only meaningful in --verify mode. Do not output an error message if the first argument is not a valid object name; instead exit with non-zero status silently. SHA-1s for valid object names are printed to stdout on
       success.

В качестве бонуса, если вы не подавите вывод, вы можете получить полный ша.