Подтвердить что ты не робот

Git pre-commit hook не работает в окнах

Я только начинаю смотреть на крючки Git, но я не могу заставить их работать.

Я установил локальный репозиторий, поэтому в папке проекта теперь есть каталог .git. Я добавил файл .cmd в каталог C:/path/to/my/project/.git/hooks с именем 'pre-commit.cmd'. Вот содержание этого файла:

echo "HOOK RUNNING"
echo. 2>C:/path/to/my/project/.git/hooks/EmptyFile.txt

Это должно отразить текст "HOOK RUNNING" и создать пустой текстовый файл в этом каталоге. Однако, если я вношу изменения в свою среду IDE (NetBeans) или использую Git Bash для фиксации, ни один из них, похоже, не запускает мой привязку до фиксации, поскольку файл не создается.

Я понимаю, что все, что вам нужно сделать, чтобы запустить hook, - это добавить исполняемый файл с именем hook (как я сделал). Я что-то делаю неправильно?

Примечание. Это на ПК с Windows 7.

4b9b3361

Ответ 1

Как насчет назначения вашего крюка pre-commit (без какого-либо расширения)?

EDIT: и добавьте #!/bin/sh в первую строку или #!/bin/bash (предлагается в комментариях)

Ответ 2

Вероятно, у вас нет разрешений для запуска файла pre-commit

Запустите в терминале:

chmod +x .git/hooks/pre-commit

Благодаря @vaughan за предоставленную идею

Ответ 3

Для меня ни одно из вышеуказанных решений не сработало. Я переместил файл предварительной фиксации из ловушек в другое место, фактически удалив файл из ловушек.

Это сработало для меня: D

Ответ 4

в моем случае, когда я npm install и случайно удалил папку .git, npm install pre-commit --save

Ответ 5

Может быть, это кому-нибудь поможет - в моем случае я установил core.hooksPath в неправильный каталог. Сброс его с помощью git config --global core.hooksPath '~/.githooks' решил проблему :)

Ответ 6

TL; DR

Git hooks по умолчанию работают в Git for Windows, если предположить, что скрипт git hook прост.

Фон из Git и Windows

Обратите внимание: Git был сделан для интерпретации оболочки; таким образом, использование перехватчиков git в командной строке Windows или Windows PowerShell по своей природе будет иметь свои недостатки, и полная функциональная совместимость не ожидается.

Использование git hooks в Windows возможно, но имеет много недостатков.

Git для Windows использует эмулятор оболочки, который делает возможными команды bash и shell. Это означает, что когда git активируется ловушка git, версия для Windows будет запускать команду, используя эмулятор оболочки. Что, в свою очередь, преобразует эти команды оболочки в команды, понятные операционной системе Windows. Это означает, что простые сценарии оболочки будут работать сразу же. Например, pre-commit git hook, которая поставляется с инициализацией репозитория git, может быть запущена без изменений.

Пример поведения по умолчанию

  1. Инициализируйте репозиторий git с помощью команды git init
  2. Перейдите в каталог git hooks с помощью команды cd.git\hooks
  3. Этот каталог содержит все скрипты git hook. Создайте файл с именем pre-commit Note

    Имя файла важно

  4. замените содержимое следующим скриптом

    #!/bin/sh
    
    echo "Hello, World!"
    
    
  5. Вернитесь в корневую директорию проекта и создайте файл с именем test.txt используя команду echo "something" > text.txt
  6. git add test.txt файл для фиксации с помощью команды git add test.txt
  7. Зафиксируйте изменения и наблюдайте за активацией ловушки перед фиксацией, используя команду git commit -m "test commit"
  8. Проверьте вывод, чтобы он выглядел следующим образом
    git commit -m "test commit"
    Hello, World!
    [master f00ccea] test commit
    

Пример плохого поведения

При использовании очень продвинутого сценария оболочки для выполнения действий в git-хуках интерпретация оболочки Windows не всегда складывается. Например, при использовании подключаемого модуля Husky Git Hook для NPM вместе с более хорошим форматером команды не отображают 1-1. Это означает, что ваш pre-commit git hook потерпит неудачу в Windows.

Отвечая на вопрос user1578653

Git hook - это исполняемый скрипт; однако вы используете сценарий командной строки (.cmd), а не сценарий оболочки (.sh). Если вам нужно такое поведение, которое вы описали в операционной системе Windows, создайте файл с именем pre-commit и поместите его в каталог .git\hooks (относительно проекта, над которым вы работаете). Затем поместите следующее содержимое в этот файл.

.git\крючки\перед фиксацией

#!/bin/sh

echo "HOOK RUNNING"
thisCausesError 2> .git/hooks/EmptyFile.txt

Вы заметите, что ловушка git работает и выводит слова HOOK RUNNING на консоль, и thisCauseError напечатает сообщение об ошибке в stderr которое будет напечатано в файле EmptyFile.txt.