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

Как определить, существует ли данный хэш git в данной ветки?

Справочная информация. Я использую автоматическую систему сборки, которая принимает хэш git как входной сигнал, а также имя ветки, на которой существует этот хэш, и создает его. Однако система сборки использует только хеш для проверки кода и его сборки - он просто сохраняет имя ветки, как указано, в метаданных базы данных сборки.

Я беспокоюсь о том, что разработчики случайно задают неправильное название ветки, когда они начинают сборку, вызывая путаницу, когда люди просматривают историю сборки.

Итак, как я могу подтвердить, прежде чем передавать имя хэша и ветки в систему сборки, что данный хеш действительно происходит из данной ветки?

4b9b3361

Ответ 1

Хм, это использование названия ветки кажется подозрительным. Как и в ответе Дастина, может быть несколько ветвей, которые содержат фиксацию. Почему для этой цели какое-либо из этих названий веток лучше другого?


Если вам нужна только одна конкретная ветвь, вы можете вычислить "базу слияния" между веткой и фиксацией.

На следующих диаграммах фиксация для сборки C, кончик заявленной ветки T, а база слияния помечена M над ней.

  • Если M равно C равно T, то фиксация для сборки является концом заявленной ветки.

                   M
                   ↓
    o--o--o--o--o--x  branch  # x is both C and T
    
  • Если M равно C, то кончик заявленной ветки является потомком коммита для сборки.

          M
          ↓
    o--o--C--o--o--T  branch
    
  • Если M равно T, то фиксация для сборки является потомком вершины заявленной ветки.

          M
          ↓
    o--o--T           branch
           \
            o--o--C
    
  • Если M равно чему-то другому, то C является потомком какого-то предка T.

          M
          ↓
    o--o--o--o--o--T  branch
           \
            o--o--C
    
  • Если нет M, то фиксация для сборки не связана с заявленной ветвью.

    o--o--o--o--o--T branch
    
    o--o--o--o--C
    

Вы можете сделать эту проверку следующим образом:

#!/bin/sh

# Usage: is-ancestor-of <branch> <commit>

if test $# -ne 2; then
    echo "$0"': invalid arguments'
    exit 128
fi
claimed_branch="$1"
commit="$2"

merge_base="$(git merge-base "$commit" "$claimed_branch")" &&
  test -n "$merge_base" &&
  test "$merge_base" = "$(git rev-parse --verify "$commit")" &&
  exit 0

echo "$commit is not an ancestor of $claimed_branch" 1>&2
exit 1

Вышеупомянутый script фактически не требует или не проверяет, что аргумент ветвления является ветвью (это может быть любое commit-ish). Чтобы проверить, что что-то действительно является веткой, вы можете использовать что-то вроде этого:

#!/bin/sh

# Usage: is-branch <branch>

if test $# -ne 1; then
    echo "$0"': invalid arguments'
    exit 128
fi
branch="$1"

# check various branch hierarchies, adjust as needed
git show-ref --verify refs/heads/"$branch" ||
git show-ref --verify refs/remotes/"$branch" || {
    echo "not a branch name: $branch" 1>&2
    exit 1
}

Итак, вы можете использовать их вместе, чтобы убедиться, что что-то является ветвью и что определенная фиксация находится в этой ветке:

is-branch "$claimed_branch" && is-ancestor-of "$claimed_branch" "$commit_to_build"

Ответ 2

Вы можете напрямую спросить git branch, какие ветки содержат данное коммитирование:

% git branch -a --contains 4f08c85ad
* master
  remotes/origin/bug_872
  remotes/origin/bug_898
  remotes/origin/master

Ответ 3

Одним из возможных не-решений было бы проанализировать результат:

$ git reflog show myBranch

и посмотрите, находится ли в нем ваш хэш.

C:\Prog\Git\tests\rep\main>git reflog show patches
786a190 [email protected]{0}: rebase finished: refs/heads/patches onto 74630b983db476c323b1d3f6771e57484551240e
8448d0f [email protected]{1}: master~1: updating HEAD
74630b9 [email protected]{2}: commit: test2
1e73e36 [email protected]{3}: branch: Created from master

Я держу это как ответ сообщества Wiki, чтобы запомнить Игорь Зевака и Крис Джонсен:

Будет ли это работать после клонирования?
Довольно уверен, что ваш рефлок начинается после того, как вы клонируете пульт. Поэтому, если ветвь имела фиксацию перед клоном, она не отображалась в рефлоге.

Существуют также проблемы с нажатиями, перестановками, выборками (для "удаленных ветвей отслеживания" ) и вытягивает (либо слияние, либо тип переадресации), где только новый наконечник заканчивается. Также reflogs по умолчанию отключены в голых репозиториях (наиболее распространенный пункт назначения для push).
Кроме того, если "обман" является проблемой, это просто вопрос редактирования текстового файла для добавления или удаления записей reflog, но это более серьезное испытание, чтобы изменить сам график истории.