2

コミット後のフックを作成しようとしています。マッピングされたドライブ (V:) に Git リポジトリがあり、C:\Git に msysgit がインストールされ、C:\Python26 に Python がインストールされています。

Windows 7 64 ビットで TortoiseGit を実行しています。

スクリプトは次のとおりです。

#!C:/Python26/python

import sys
from subprocess import Popen, PIPE, call

GIT_PATH = 'C:\Git\bin\git.exe'
BRANCHES = ['master']
TRAC_ENV = 'C:\TRAC_ENV'
REPO_NAME = 'core'

def call_git(command, args):
    return Popen([GIT_PATH, command] + args, stdout=PIPE).communicate()[0]

def handle_ref(old, new, ref):
    # If something else than the master branch (or whatever is contained by the
    # constant BRANCHES) was pushed, skip this ref.
    if not ref.startswith('refs/heads/') or ref[11:] not in BRANCHES:
        return

    # Get the list of hashs for commits in the changeset.
    args = (old == '0' * 40) and [new] or [new, '^' + old]
    pending_commits = call_git('rev-list', args).splitlines()[::-1]

    call(["trac-admin", TRAC_ENV, "changeset", "added", REPO_NAME] + pending_commits)

if __name__ == '__main__':
    for line in sys.stdin:
        handle_ref(*line.split())

コマンドラインから「git commit ...」コマンドを実行すると、フックスクリプトがまったく実行されないようです。

4

1 に答える 1

2

githooks のマニュアルページによると、

[コミット後フック] は git-commit によって呼び出されます。これはパラメーターを必要とせず、コミットが行われた後に呼び出されます。

パラメータは必要ありません。Python では、これは sys.argv[1:] が空のリストになることを意味します。man ページには、stdin に何が送信されるかについては記載されていませんが、おそらく何も記載されていません。それを確認しましょう。

小さな git ディレクトリを作成し、これを .git/hooks/post-commit に配置しました。

#!/usr/bin/env python 
import sys
def handle_ref(old, new, ref):
    with open('/tmp/out','w') as f:
        f.write(old,new,ref)
if __name__ == '__main__':
    with open('/tmp/out','w') as f:
        f.write('post-commit running')
    for line in sys.stdin:
        handle_ref(*line.split())
        with open('/tmp/out','w') as f:
            f.write('Got here')

そして実行可能にしました。

コミットすると、/tmp/out ファイルが作成されていることがわかりますが、その内容は

post-commit running

スクリプトは実行されましたがfor line in sys.stdin:、sys.stdin には何も送信されないため、ループは何もしません。

他の方法で送信する引数を生成する必要があります。handle_refおそらく、何らかの git コマンドへのサブプロセス呼び出しを通じてです。

于 2010-11-13T00:21:59.953 に答える