Git не может выполнить Python-скрипт как хук - PullRequest
11 голосов
/ 16 февраля 2012

Я создал небольшой pre-commit хук в python. Этот хук работает как прелесть в Linux, но в Windows он постоянно говорит мне:

error: cannot spawn .git/hooks/pre-commit: No such file or directory

Я знаю, что здесь были похожие вопросы о той же самой проблеме и заключительные швы, чтобы быть шебангом. Мой скрипт имеет это в самой первой строке:

#!F:\PortableApps\PortablePython3.2\App\python.exe

Также интересно отметить, что выполнение сценария простым написанием .git/hooks/pre-commit работает замечательно, но как только я пытаюсь зафиксировать, git выплевывает вышеприведенное сообщение.

Еще одна интересная вещь: когда я конвертирую кодировку из ANSI в UTF-8 (используя Notepad ++), я получаю следующую ошибку при попытке выполнить скрипт:

.git/hooks/pre-commit: Cannot execute binary file

Я использую следующие инструменты:

1 Ответ

12 голосов
/ 05 июня 2012

Я использовал прокси-подход, чтобы скрипт Python работал под Windows (с помощью msysgit).Полный сценарий (с описанием того, как я это сделал) можно найти здесь: https://gist.github.com/1839424

Вот важная часть о том, как заставить его работать под Windows


Если выработать с Windows (и msysgit) немного сложнее.Поскольку msysgit, похоже, имеет проблему с обработкой SHEBANG , вам придется использовать небольшую хитрость, чтобы сделать исполняемый скрипт (дополнительную информацию по этой проблеме можно найти здесь ).

Чтобы скрипт работал, вам нужно удалить SHEBANG из скрипта Python («pre-commit.py») и использовать bash-скрипт-обертку для вызова интерпретатора.Этот скрипт должен выглядеть примерно так:

#!/bin/sh
python .git/hooks/pre-commit.py

Сохраните этот скрипт как файл с именем «pre-commit» (без окончания файла).Это предполагает, что у вас есть Python в вашем PATH .Если вы этого не сделаете, вы также можете указать полный путь к исполняемому файлу интерпретатора.

Этот скрипт будет вызываться "git commit" и вызывать скрипт python для проверки на наличие огромных файлов.Путь после SHEBANG не должен изменяться, так как msysgit переназначит его автоматически.Вы должны указать путь относительно корня репо для скрипта Python, который будет выполняться (потому что именно из него вызывается скрипт).

После этого вы захотите скопировать оба файла-оболочки ("pre-commit ") и Python-скрипт (" pre-commit.py ") в ваши репозитории" .git / hooks "-директория, персонализируйте Python-скрипт (" max_file_size "и" git_binary_path ") и отметьтеcommit "-file исполняемый файл.

...