Я пытаюсь написать post-commit hook, у меня есть репозиторий Git на сопоставленном диске (V:), msysgit установлен в C:\Git и Python в C:\Python26.
Я запускаю TortoiseGit для Windows 7 64 бит.
script:
#!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..." из командной строки, она вообще не запускает hook script.
В соответствии с githooks man page,
[Крюк post-commit] вызывается git -commit. Он не принимает параметр и вызывается после совершения фиксации.
Он не принимает никаких параметров. В Python это означает, что sys.argv [1:] будет пустым. На странице руководства не указано, что, если что угодно, отправляется на 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
Итак, запущен script, но цикл for line in sys.stdin:
ничего не делает, поскольку ничего не отправляется в sys.stdin.
Вам нужно будет сгенерировать аргументы для отправки на handle_ref
каким-либо другим способом, возможно, через вызов подпроцесса к некоторой команде git.
.git/hooks/post-commit
и исполняемый?