Ошибка мерзавца: не может порождать .git / hooks / post-commit: Нет такого файла или каталога - PullRequest
2 голосов
/ 12 ноября 2010

Я пытаюсь написать хук после фиксации, у меня есть репозиторий Git на подключенном диске (V :), msysgit, установленный в C: \ Git, и Python в C: \ Python26.

Я использую TortoiseGit в 64-разрядной версии Windows 7.

Сценарий:

#!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 ..." из командной строки, она, похоже, даже не запускает скрипт ловушки.

1 Ответ

2 голосов
/ 13 ноября 2010

Согласно справочной странице githooks ,

[Хук после фиксации] вызывается git-commit.Он не принимает никаких параметров и вызывается после выполнения коммита.

Не принимает параметров.В Python это означает, что sys.argv [1:] будет пустым списком.Страница руководства не говорит, что, если что-нибудь, отправлено на стандартный ввод, но, вероятно, ничего.Давайте проверим это.

Я сделал небольшой каталог 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.

...