34

'update'フックに問題があります。新しいブランチの場合、「oldrev」として0000000000000000000000000000000000000000を取得します。そして、私はそのケースを処理する方法がわかりません。

すべてのコミットメッセージが有効なJiraの問題を参照するという要件があります。そこで、中央リポジトリに「更新」フックをインストールしました。そのフックは「oldrev」と「newrev」を取得します。次に、それらを次のように「gitrev-list」に渡します。

git rev-list $oldrev..$newrev

これにより、すべての回転数のリストが表示されます。このリストを繰り返し処理して、必要な処理を実行できます。

問題は、ユーザーが新しいブランチをプッシュすると、フックがoldrevとして0000000000000000000000000000000000000000を取得することです。そして、「gitrev-list」は単に次のように文句を言います。

fatal: Invalid revision range 0000000000000000000000000000000000000000..21bac83b2

では、その新しいブランチにあるすべての回転数のリストを取得するにはどうすればよいですか?私はかなり長い間ネットを検索しましたが、何も見つかりませんでした。私が見つけたフックの例

  • 問題を処理せず、上記のエラーメッセージで失敗します
  • oldrevを""に設定して問題を誤って修正しようとすると、rev-listから誤った結果が返されます。
  • 彼らがそのoldrevに遭遇したときに単にあきらめる

これらのどれも特にエキサイティングに聞こえません。

それで、誰かがその場合に正しい答えを得る方法を知っていますか?「newrevから到達可能であるが、他のブランチ(=新しいブランチを除くすべてのブランチ)からは到達できないすべての回転数を取得する」ためにgitにクエリを実行することを考えていました。しかし、それでも、新しいブランチから古いブランチへのマージがあった場合、間違った答えが返されます。

4

4 に答える 4

17

この場合、「正解」という用語は少しあいまいです。私は実際、「すべての回転数は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
于 2010-08-18T12:55:42.560 に答える
13

$oldrevがすべてゼロの場合、別のコマンドgit rev-listが必要なすべてを実行します。

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

$newrevブランチから到達可能であるが、どのブランチからも到達できないリビジョンのリストが表示されます。

これは、oldrevがすべてゼロではない場合とはまったく同じことではないことに注意してください。そのため、どちらの場合かを確認し、実行する適切なコマンドを選択する必要があります。git rev-list $oldrev..$newrev

于 2013-11-02T01:54:05.820 に答える
7

私はそれを自分で理解しました。

git lognewref--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)
于 2011-03-23T16:22:52.103 に答える
2

私は以下を使用して私の更新フックのためにこれを解決しました:

if [ "$oldrev" -eq 0 ]; then
git log "$(git show-branch --merge-base)".."$newrev"; else
foo;
fi
于 2012-06-01T12:41:02.440 に答える