Git получает / обновляет хуки и новые ветки - PullRequest
30 голосов
/ 18 августа 2010

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

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

git rev-list $oldrev..$newrev

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

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

fatal: Invalid revision range 0000000000000000000000000000000000000000..21bac83b2

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

  • не решают проблему, и приводят к ошибке с сообщением об ошибке выше
  • , неправильно пытаясь решить проблему, устанавливая oldrev в "", чтовозвращает неверные результаты из списка оборотов
  • просто сдавайтесь, когда они сталкиваются с этим oldrev

Ни один из этих звуков не является особенно захватывающим.

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

Ответы [ 4 ]

16 голосов
/ 18 августа 2010

Термин «правильный ответ» в этом случае немного неоднозначен.Я на самом деле думаю, что «все обороты достижимы от 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
11 голосов
/ 02 ноября 2013

Когда $oldrev - все нули, другая команда git rev-list сделает все, что вам нужно:

git rev-list $newrev --not --branches=*

выдаст вам список ревизий, доступных с $newrev, но не из каких-либо ветвей.

Обратите внимание, что это определенно не делает то же самое, что и git rev-list $oldrev..$newrev, когда oldrev не все нули, так что вы захотите проверить, в каком случае выи выберите соответствующую команду для запуска.

7 голосов
/ 23 марта 2011

Я просто понял это сам.

git log newref - not otherheads

- это ключ для получения всех журналов ветви, которых нет ни в одной другой ветви.Ниже приведен мой скрипт на python для проверки правильности максимальной длины строки сообщений коммита.

import sys
import commands

ref = sys.argv[1]
old = sys.argv[2]
new = sys.argv[3]

x = 0

# only a tag is pushed to server, nothing to check
if ref.find('refs/tags/') >= 0:
  if len(ref.strip('refs/tags/')) > 25:
    print 'tag name is longer than 25 characters'
    exit(1)
  else:
    exit(0)
# either a new branch is pushed or an empty repo is being pushed
if old == '0000000000000000000000000000000000000000':
  heads = commands.getoutput("git for-each-ref --format='%(refname)' 'refs/heads/*'")
  heads = heads.replace(ref+'\n','').replace('\n',' ')
  hashes = commands.getoutput('git log '+new+' --pretty=%H --not '+heads).split('\n')
else:
  hashes = commands.getoutput('git log '+old+'..'+new+' --pretty=%H').split('\n')

for hash in hashes:
  subject = commands.getoutput('git show '+hash+' --format=%s --summary').split('\n')
  body = commands.getoutput('git show '+hash+' --format=%b --summary').split('\n')

  if len(subject[0]) > 75:
    print
    print 'commit: '+hash
    print 'bad commit message(s): header line is too long or second line is not blank (max 75 chars)'
    print 'bad line: "%s"' % subject[0]
    print 'length of header line: %d' % len(subject[0])
    print 'try again with correct message format'
    print
    x = 1

  for line in body: 
    if len(line) > 75:
      print
      print 'commit: '+hash
      print 'bad commit message(s): description lines are too long (max 75 chars)'
      print 'bad line: "%s"' % line
      print 'length of  line: %d' % len(line)
      print 'try again with correct message format'
      print
      x = 1

if x == 0:
  exit(0)
else:
  exit(1)
2 голосов
/ 01 июня 2012

Я решил это для моего хука обновления, используя следующее:

if [ "$oldrev" -eq 0 ]; then
git log "$(git show-branch --merge-base)".."$newrev"; else
foo;
fi
...