如果您在中看到接受的答案:Aggregating and uglifying JavaScript in a Git pre-commit hook,您将看到我必须在预提交钩子上执行chmod +x
才能使其工作。
为什么默认情况下Git不能执行这个命令?
如果您在中看到接受的答案:Aggregating and uglifying JavaScript in a Git pre-commit hook,您将看到我必须在预提交钩子上执行chmod +x
才能使其工作。
为什么默认情况下Git不能执行这个命令?
9条答案
按热度按时间aor9mmx11#
我的上下文- Web开发Node.js。我需要添加husky功能,但得到了一个错误,可能是磁盘访问。这对我的情况有帮助:
2mbi3lxu2#
因为默认情况下文件是不可执行的;必须将它们设置为可执行。
git init
中的示例文件都是可执行文件;如果它被复制或重命名为非示例文件,它将保留原始文件的x
标志。将使用当前默认值创建新文件。在您的情况下,请使用
umask
查看这些默认值:默认情况下,新文件不会是
u+x
,除非显式设置为。3duebb1j3#
我不得不在我的预提交钩子上执行
chmod +x
来使它工作问题是要意识到它一开始就不可执行。
使用Git 2.15.x/2.16(2018年第一季度)会更容易
参见Damien Marié (
mdamien
)(2017年10月6日)。(由Junio C Hamano --
gitster
--合并至commit 130b512,2017年11月6日)run-command
:忽略挂接时添加提示当钩子存在,但文件没有被设置为可执行文件时,git会忽略钩子。
现在,这是沉默,这可能会令人困惑。
此提交添加此警告以改善这种情况:
为了允许通过可执行标志启用/禁用钩子的旧用例,引入了一个新设置:
advice.ignoredHook
.ecfsfe2w4#
作为参考,在将文件设置为可执行文件后,如果由于文件模式的改变而导致git文件中出现的可执行文件发生了变化,则可以执行以下操作:(在Ubuntu/Linux中试用)
参考:How do I remove files saying "old mode 100755 new mode 100644" from unstaged changes in Git?
q5iwbnjs5#
我可以通过运行下面的命令来解决这个问题。
我在
Windows
中初始化husky
,之后WSL出现问题,考虑到Windows
初始化时Linux
的文件权限,很可能是没有创建的问题。sh7euo9m6#
我也有同样的症状,但病因完全不同:
除了通过
chmod +x .git/hooks/pre-commit
设置正确的权限位之外,请确保您的 * 文件系统 * 以允许这些更改的方式挂载。例如,当您在Linux下使用ntfs-3g
挂载的Windows驱动器的双引导系统时,这可能是一个问题。您可以通过更改
/etc/fstab
或systemd等效文件中的默认权限来修复此问题。zqdjd7g97#
作为一个附加的答案,这里有一个函数,你可以用来初始化一个Git仓库,它会自动使钩子成为可执行文件;你应该把它放在
.bashrc
或你启动终端时的源文件中。故事如下:)我和你一样也很恼火,我不想记住每次初始化仓库时都要把所有的钩子都变成可执行的,另外,当你使用submodules时,它们的钩子不在
.git/hooks
中,而是在.git/modules/NameOfSubmodule/hooks
中,这些钩子也应该变成可执行的。brtdzjyr8#
原始模板钩子文件必须是可执行的。
在我的例子中,它是一个缺少可执行位的自定义钩子:
现在,在
git init
或git clone
上创建的pre-commit
钩子已正确设置为可执行:请参见www.example.comhttps://git-scm.com/docs/git-init#_template_directory
zlwx9yxi9#
我已通过运行以下命令解决了此问题