Почему мой Git pre-commit hook не является исполняемым по умолчанию?

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

Почему это не выполняется с помощью git по умолчанию?

Ответ 1

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

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

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

$ umask
0022

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

Ответ 2

Мне пришлось выполнить chmod +x на моем хуке pre-commit, чтобы заставить его работать

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

См. Коммит f805a00 (06 октября 2017 г.) Дэмиена mdamien (mdamien).
(Объединено с Junio C Hamano - gitster - в коммите 130b512, 06 ноября 2017 г.)

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

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

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

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

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

Ответ 3

Так же, как дополнительный ответ, вот функция, которую вы можете использовать для инициализации 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, и они тоже должны быть исполняемыми.