Почему мой 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
, и они тоже должны быть исполняемыми.