为什么我的Git预提交挂钩默认不可执行?

时间:2011-12-22 01:55:14

标签: git githooks

如果您在以下位置看到接受的答案: Aggregating and uglifying javascript in a git pre-commit hook,您会看到我必须在我的预提交挂钩上执行chmod +x才能使其正常工作。

为什么Git默认不能执行此操作?

5 个答案:

答案 0 :(得分:20)

因为默认情况下文件不可执行;必须将它们设置为可执行文件。

来自git init的示例文件都是可执行文件;如果将其复制或重命名为非样本文件,它将保留原始文件的x标记。

将使用当前默认值创建新文件。在您的情况下,请使用umask查看这些默认值:

$ umask
0022

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

答案 1 :(得分:7)

  

我必须在我的预提交挂钩上执行chmod +x才能使其正常工作

问题是要意识到它首先不可执行 使用Git 2.15.x / 2.16(2018年第一季度)

会更容易

commit f805a00Damien 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来解决此问题。