为什么我的Git预提交钩子在默认情况下不可执行?

olhwl3o2  于 2023-02-28  发布在  Git
关注(0)|答案(9)|浏览(306)

如果您在中看到接受的答案:Aggregating and uglifying JavaScript in a Git pre-commit hook,您将看到我必须在预提交钩子上执行chmod +x才能使其工作。
为什么默认情况下Git不能执行这个命令?

aor9mmx1

aor9mmx11#

我的上下文- Web开发Node.js。我需要添加husky功能,但得到了一个错误,可能是磁盘访问。这对我的情况有帮助:

chmod ug+x .husky/*
chmod ug+x .git/hooks/*
2mbi3lxu

2mbi3lxu2#

因为默认情况下文件是不可执行的;必须将它们设置为可执行。
git init中的示例文件都是可执行文件;如果它被复制或重命名为非示例文件,它将保留原始文件的x标志。
将使用当前默认值创建新文件。在您的情况下,请使用umask查看这些默认值:

$ umask
0022

默认情况下,新文件不会是u+x,除非显式设置为。

3duebb1j

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会忽略钩子。

现在,这是沉默,这可能会令人困惑

此提交添加此警告以改善这种情况:

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 .

ecfsfe2w

ecfsfe2w4#

作为参考,在将文件设置为可执行文件后,如果由于文件模式的改变而导致git文件中出现的可执行文件发生了变化,则可以执行以下操作:(在Ubuntu/Linux中试用)

chmod ug+x .husky/pre-commit # make file executable
git config core.filemode false # to ignore file mode changes

参考:How do I remove files saying "old mode 100755 new mode 100644" from unstaged changes in Git?

q5iwbnjs

q5iwbnjs5#

我可以通过运行下面的命令来解决这个问题。

chmod ug+x .husky/*

我在Windows中初始化husky,之后WSL出现问题,考虑到Windows初始化时Linux的文件权限,很可能是没有创建的问题。

sh7euo9m

sh7euo9m6#

我也有同样的症状,但病因完全不同:
除了通过chmod +x .git/hooks/pre-commit设置正确的权限位之外,请确保您的 * 文件系统 * 以允许这些更改的方式挂载。例如,当您在Linux下使用ntfs-3g挂载的Windows驱动器的双引导系统时,这可能是一个问题。
您可以通过更改/etc/fstabsystemd等效文件中的默认权限来修复此问题。

zqdjd7g9

zqdjd7g97#

作为一个附加的答案,这里有一个函数,你可以用来初始化一个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
}

我和你一样也很恼火,我不想记住每次初始化仓库时都要把所有的钩子都变成可执行的,另外,当你使用submodules时,它们的钩子不在.git/hooks中,而是在.git/modules/NameOfSubmodule/hooks中,这些钩子也应该变成可执行的。

brtdzjyr

brtdzjyr8#

原始模板钩子文件必须是可执行的。
在我的例子中,它是一个缺少可执行位的自定义钩子:

$ 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 initgit clone上创建的pre-commit钩子已正确设置为可执行:

$ git init hook-exec
$ stat -c "%A" hook-exec/.git/hooks/pre-commit 
-rwxrwxr-x

请参见www.example.comhttps://git-scm.com/docs/git-init#_template_directory

zlwx9yxi

zlwx9yxi9#

我已通过运行以下命令解决了此问题

chmod ug+x .husky/*

相关问题