如果您在以下位置看到接受的答案:
Aggregating and uglifying javascript in a git pre-commit hook,您会看到我必须在我的预提交挂钩上执行chmod +x
才能使其正常工作。
为什么Git默认不能执行此操作?
答案 0 :(得分:20)
因为默认情况下文件不可执行;必须将它们设置为可执行文件。
来自git init
的示例文件都是可执行文件;如果将其复制或重命名为非样本文件,它将保留原始文件的x
标记。
将使用当前默认值创建新文件。在您的情况下,请使用umask
查看这些默认值:
$ umask
0022
默认情况下,新文件不会是u+x
,除非明确设置为。
答案 1 :(得分:7)
我必须在我的预提交挂钩上执行
chmod +x
才能使其正常工作
问题是要意识到它首先不可执行 使用Git 2.15.x / 2.16(2018年第一季度)
会更容易 commit f805a00见Damien Marié (mdamien
)(2017年10月6日)
(Junio C Hamano -- gitster
--合并于commit 130b512,2017年11月6日)
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
。
答案 2 :(得分:6)
这对我的情况有帮助:
chmod ug+x .husky/*
chmod ug+x .git/hooks/*
答案 3 :(得分:0)
作为附加答案,这是函数,您可以用来初始化git存储库,该存储库自动使hooks成为可执行文件;您应该在启动终端时将其放入.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
}
和你一样,我也很生气。我不想记住,每次初始化存储库时,我都必须使所有hooks可执行文件。另外,当您使用子模块时,它们的钩子不在.git/hooks
中,而是在.git/modules/NameOfSubmodule/hooks
中,并且这些钩子也应成为可执行文件。
答案 4 :(得分:0)
我有相同的症状但完全不同的原因–我将其张贴在这里,因为这样可以为我节省近一个小时的时间:
除了通过chmod +x .git/hooks/pre-commit
设置正确的权限位之外,请确保您的文件系统的安装方式允许这些更改。这可以例如当您使用双引导系统时,如果要在Linux下ntfs-3g
挂载的Windows驱动器上工作,就会出现问题。
您可以通过更改/etc/fstab
中的默认权限或等效的systemd来解决此问题。