chmod +x
才能使其工作。为什么Git默认情况下无法执行此操作?
chmod +x
才能使其工作。为什么Git默认情况下无法执行此操作?
我的情境是Web开发Node.js。我需要添加husky功能,但遇到了错误,可能是磁盘访问问题。这对我的情况有所帮助:
chmod ug+x .husky/*
chmod ug+x .git/hooks/*
默认情况下,文件不可执行;必须将其设置为可执行。
git init
中的示例文件都是可执行的;如果将其复制或重命名为非示例文件,则会保留原始文件的x
标志。
新文件将使用当前默认值创建。在您的情况下,可以通过 umask
查看这些默认值:
$ umask
0022
默认情况下,新文件不会是u+x
,除非明确设置为这样。
git init
来重新初始化存储库,但仍然不起作用。我使用 TextMate 编辑了文件,这可能是问题所在,但仍无法解释为什么 git init
不能正确执行 chmod u+x
。 - Josh Smith0133
)时,问题才会发生,但我想知道是谁设置了这样的umask,我们从您的解释中无法理解。 - Jean Paul我必须对我的预提交钩子执行chmod +x
才能让它工作。
问题在于首先它是不可执行的。
这将更容易通过Git 2.15.x/2.16 (2018年第一季度)实现。
请参见commit f805a00 (2017年10月6日),作者为Damien Marié (mdamien
)。
(由Junio C Hamano -- gitster
--合并于commit 130b512, 2017年11月6日)
当存在一个钩子但文件未设置为可执行时,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
。chmod +x .git/hooks/pre-commit
,在我的 macOS 10.13.3 上能够成功运行。 - Jagdeep Singh仅供参考,如果将文件设为可执行文件后,由于文件模式的更改而在Git文件更改中出现,下面的命令可以解决该问题(在Ubuntu / Linux中测试通过)
chmod ug+x .husky/pre-commit # make file executable
git config core.filemode false # to ignore file mode changes
chmod ug+x .husky/pre-commit
可以解决在 WSL Windows (Ubuntu) 上的问题。 - Shamim Hossainchmod ug+x .husky/*
我在Windows
中初始化了husky
。之后,在WSL中发生了问题,这可能是因为在Windows
中初始化时没有考虑Linux
的文件权限而导致的问题。
我的症状一样,但是原因完全不同:
除了通过 chmod +x .git/hooks/pre-commit
设置正确的权限位之外,请确保您的文件系统以允许这些更改的方式被挂载。例如,如果您在 Linux 下使用 ntfs-3g
挂载的 Windows 磁盘上工作,这可能会成为一个问题。
您可以通过更改 /etc/fstab
或systemd的相关内容来解决此问题。
补充一下,这是一个函数,用于初始化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/子模块名称/hooks
中,这些也应该被设置为可执行文件。husky add
而不是手动创建文件。 - undefinedchmod ug+x .husky/*
原始的模板钩子文件必须是可执行的。
在我的情况下,这是一个缺少可执行位的自定义钩子:
$ git config init.templateDir
~/.git_template
$ stat -c "%A" ~/.git_template/hooks/pre-commit
-rw-r--r--
$ chmod u+x ~/.git_template/hooks/pre-commit
git init
或git clone
命令时创建的pre-commit
钩子已正确设置为可执行文件:$ git init hook-exec
$ stat -c "%A" hook-exec/.git/hooks/pre-commit
-rwxrwxr-x