Git получить / обновить хуки и новые ветки

У меня проблема с хуком 'update'. В случае новой ветки он получает 0000000000000000000000000000000000000000 как «oldrev». И я не знаю, как справиться с этим делом.

У нас есть требование, чтобы каждое сообщение о фиксации ссылалось на действительную проблему Jira. Поэтому я установил хук обновления в нашем центральном хранилище. Этот хук получает «oldrev» и «newrev». Затем я передаю их в «git rev-list» следующим образом:

git rev-list $ oldrev .. $ newrev

Это дает мне список всех оборотов, которые я затем могу перебрать, и сделать все, что я нужно сделать.

Проблема в том, что когда пользователь нажимает на новую ветвь, ловушка получает 0000000000000000000000000000000000000000 как oldrev. А «git rev-list» просто жалуется:

fatal: Неверный диапазон ревизий 0000000000000000000000000000000000000000 .. 21bac83b2

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

  • , не решают проблему, и терпят неудачу с приведенным выше сообщением об ошибке
  • . Неправильно пытаются решить проблему, установив oldrev в «», что возвращает неверные результаты из rev-list
  • просто сдавайся, когда они сталкиваются с этим стариком.

Ничто из этого не звучит особенно захватывающе.

Так есть ли у кого-нибудь идеи, как получить правильный ответ в этом случае? Я думал о том, чтобы запросить git для «дай мне все обороты, которые доступны из newrev, но не из любой другой ветви (= все ветви, кроме новой)». Но даже это дало бы неправильный ответ, если бы произошло слияние новой ветви с какой-либо из старых.

31
задан marc.guenther 18 August 2010 в 10:23
поделиться

1 ответ

Термин «правильный ответ» в этом случае несколько неоднозначен. Я вообще-то думаю, что «все обороты доступны из newrev, но нигде больше» совершенно правильно. Это верно, даже если было слияние - в этом случае вы должны увидеть коммиты, уникальные для новой ссылки, и фиксацию слияния, но не коммиты, которые были слиты.

Итак, я бы сказал, проверьте, все ли "oldrev" нули, и если да, действуйте соответственно:

if [ "$oldrev" -eq 0 ]; then
    # list everything reachable from newrev but not any heads
    git rev-list $(git for-each-ref --format='%(refname)' refs/heads/* | sed 's/^/\^/') "$newrev"
else
    git rev-list "$oldrev..$newrev"
fi
16
ответ дан 27 November 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: