git не может выполнить python-скрипт как хук

Я создал небольшой pre-commit хук в питоне. Этот хук работает как шарм под 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

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


person Lukas Knuth    schedule 16.02.2012    source источник
comment
@Amber, использующий bash-скрипт в качестве оболочки для вызова python.exe pre-commit.py, работает. Но есть ли версия только для Python?   -  person Lukas Knuth    schedule 16.02.2012


Ответы (1)


Я использовал прокси-подход, чтобы скрипт 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" -directory, персонализировать Python-скрипт ("max_file_size" и "git_binary_path") и отметьте исполняемый файл "pre-commit" -file.

person Lukas Knuth    schedule 05.06.2012
comment
Если вы хотите распространить аргументы (например, для ловушки после оформления заказа), добавьте $*: python .git/hooks/pre-commit.py $* - person Onur; 18.10.2012
comment
Сам скрипт Python не обязательно должен находиться в каталоге .git. Если хотите, он может быть в другом месте вашего репозитория, чтобы он был зафиксирован как часть репозитория. Кроме того, довольно просто автоматизировать установку хуков git в новый клон репозитория путем программного создания сценариев оболочки, описанных здесь, в папке .git / hooks. - person bsa; 15.10.2013
comment
что, если у членов команды разнородные операционные системы. Например, у нас есть репозиторий Android, и разработчики работают над ним как на OS X, так и на Windows. как мы можем гарантировать, что наш хук работает в разных операционных системах? - person Saeed Neamati; 27.06.2016
comment
Вы можете использовать решение @Luks в Mac OS, GNU / Linux и Windows. - person Alireza Bashiri; 27.06.2016