Почему мой хук Git pre-commit не исполняется по умолчанию? - PullRequest
11 голосов
/ 22 декабря 2011

Если вы видите принятый ответ в: Агрегирование и удаление javascript в хите pre-commit git , вы увидите, что мне пришлось сделать chmod +x на хуке pre-commit для того, чтобы он заработал.

Почему это не исполняется Git по умолчанию?

Ответы [ 3 ]

20 голосов
/ 22 декабря 2011

Поскольку файлы не являются исполняемыми по умолчанию;они должны быть установлены как исполняемые.

Все файлы примеров из git init являются исполняемыми;если он скопирован или переименован в файл не-образца, он сохранит флаг x исходного файла.

Новые файлы будут созданы с текущими значениями по умолчанию.В вашем случае просмотрите эти значения по умолчанию с помощью umask:

$ umask
0022

По умолчанию новые файлы не будут иметь u+x, если явно не установлено значение.

7 голосов
/ 07 ноября 2017

Мне пришлось сделать chmod +x на моем хуке предварительной фиксации, чтобы заставить его работать

Проблема заключается в том, чтобы понять, что он не был исполняемым во-первых.
Это будет проще с Git 2.15.x / 2.16 (Q1 2018)

См. commit f805a00 (06 октября 2017) Damien Marié (mdamien) .
(Объединено Junio ​​C Hamano - gitster - в коммит 130b512 , 06 ноября 2017 г.)

run-command: добавить подсказку, когда хук игнорируется

Если хук присутствует, но файл не установлен как исполняемый, то git будет игнорировать хук.
Пока этотихий, который может сбить с толку .

Этот коммит добавляет это предупреждение для улучшения ситуации:

hint: The 'pre-commit' hook was ignored because it's not set as executable.
hint: You can disable this warning with `git config advice.ignoredHook false`

Чтобы разрешить старый вариант использования включения /отключение перехватчиков через флаг исполняемого файла, введена новая настройка: advice.ignoredHook.

1 голос
/ 26 апреля 2019

Так же, как дополнительный ответ, вот функция, которую вы можете использовать для инициализации git-репозитория, которая автоматически делает перехватчики исполняемыми файлами;Вы должны поместить его в .bashrc или в файл, который вы используете при запуске терминала.История ниже:)

ginit () {                                                                                                                                                                   
    git init                                                                                                                                                                 
    gitpath=`git rev-parse --show-superproject-working-tree --show-toplevel | head -1`                                                                                       
    chmod u+x "$gitpath"/.git/hooks/*                                                                                                                                        
    for submodule in "$gitpath"/.git/modules/*; do                                                                                                                           
        chmod u+x "$submodule"/hooks/*                                                                                                                                       
    done                                                                                                                                                                     
} 

Меня раздражало то же, что и вы.Я не хочу помнить, что мне приходится делать все исполняемые файлы ловушек каждый раз, когда я инициализирую репозиторий.Кроме того, когда вы используете подмодули, их перехваты находятся не в .git/hooks, а в .git/modules/NameOfSubmodule/hooks, и их тоже следует выполнять исполняемыми.

...