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

1

Я пытаюсь написать 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.

  • 0
    Итак ... ошибка в названии вашего вопроса происходит, когда вы пытаетесь выполнить коммит через TortoiseGit, и коммит из командной строки работает успешно (просто без выполнения перехвата), верно? Действительно ли хук в .git/hooks/post-commit и исполняемый?
Теги:
tortoisegit
shebang
trac

1 ответ

1
Лучший ответ

В соответствии с 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню