error de git: no puede generar .git / hooks / post-commit: no existe ningún file o directory

Estoy intentando escribir un enganche post-commit, tengo un repository de Git en una unidad mapeada (V :), msysgit instalado en C: \ Git y Python en C: \ Python26.

Estoy ejecutando TortoiseGit en Windows 7 64 Bit.

El script es:

#!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()) 

Si ejecuto el command "git commit …" desde la command-line, ni siquiera parece ejecutar el script hook.

De acuerdo con la página man de githooks ,

[El enlace post-commit] es invocado por git-commit. No requiere ningún parámetro, y se invoca después de realizar una confirmación.

No requiere parameters. En Python, eso significa que sys.argv [1:] será una list vacía. La página man no dice qué, en todo caso, se envía a stdin, pero presumiblemente nada. Vamos a verificar eso.

Hice un pequeño directory git y lo puse en .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') 

y lo hizo ejecutable.

Cuando realizo una confirmación, veo que se ha creado el file / tmp / out, pero sus únicos contenidos son

 post-commit running 

Así que se ejecutó el script, pero la for line in sys.stdin: loop no hace nada, ya que no se envía nada a sys.stdin.

Necesitará generar los arguments para enviar a handle_ref de alguna otra manera, quizás a través de una llamada de subprocess a algún command git.