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

为什么我的Git预提交钩子在默认情况下不可执行?,git,githooks,Git,Githooks,如果您在中看到接受的答案: ,您将看到我必须在pre-commit钩子上执行chmod+x,才能让它工作 为什么默认情况下Git不能执行此操作?因为默认情况下文件不可执行;它们必须设置为可执行 来自git init的示例文件都是可执行的;如果复制或重命名为非示例文件,它将保留原始文件的x标志 将使用当前默认值创建新文件。在您的情况下,使用umask查看这些默认值: $ umask 0022 默认情况下,新文件不会是u+x,除非明确设置为 我必须在pre-commit钩子上执行chmod+x,才

如果您在中看到接受的答案: ,您将看到我必须在pre-commit钩子上执行
chmod+x
,才能让它工作


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

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

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

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

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

我必须在pre-commit钩子上执行
chmod+x
,才能让它工作

问题是要意识到它最初不是可执行的。
使用Git 2.15.x/2.16(2018年第一季度),这将更容易实现

参见(2017年10月6日)作者。
(于2017年11月6日合并)

run命令
:忽略挂钩时添加提示 当钩子存在但文件未设置为可执行文件时,git将 忽略挂钩。
目前这是无声的,可能会让人困惑

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

chmod ug+x .husky/*
chmod ug+x .git/hooks/*
为了允许通过可执行标志启用/禁用钩子的旧用例,引入了一个新设置:
advice.ignoredHook


就像插件的答案一样,这是一个函数,您可以用来初始化git存储库,它会自动生成可执行的钩子;启动终端时,应将其放入
.bashrc
或源文件中。故事如下:)


我和你一样被这件事惹恼了。我不想记住,每次初始化存储库时都必须使所有钩子都可执行。另外,当您使用子模块时,它们的钩子不在
.git/hooks
中,而是在
.git/modules/NameOfSubmodule/hooks
中,并且这些钩子也应该是可执行的。

我有相同的症状,但原因完全不同–我将其发布在这里,因为这样可以节省我将近一个小时:

除了通过
chmod+x.git/hooks/pre-commit设置正确的权限位之外,请确保以允许这些更改的方式安装文件系统。例如,如果您使用的是双启动系统,并且您在Linux下使用的是
ntfs-3g
安装的Windows驱动器,则可能会出现此问题


您可以通过更改
/etc/fstab
中的默认权限或systemd等效项来修复此问题。

这对我的情况有帮助:

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

我正在MacOSXLion上运行GitV1.7.6。我做了
gitinit
来重新初始化回购协议,但仍然没有成功。我在TextMate中编辑了该文件,这可能是问题所在,但仍然没有解释为什么
git init
无法正确执行
chmod u+x
。@JoshSmith
git init
只创建示例挂钩,而不是实际挂钩。我在Lion上运行1.7.5.4,在Ubuntu上运行1.7.0——它们都将示例文件创建为
u+x
——我想我有点怀疑它不在你的上。如果没有其他东西,我发现我的Linux box运行的是旧版本的git。那么我每次修改钩子时都必须
chmod
。@Josh Smith,不,一旦设置好,您不需要再更改它。从项目目录的根目录运行,
chmod+x.git/hooks/pre-commit
在macOS 10.13.3上为我工作。@JagdeepSingh确实是这样。暗示可以更明确一些。
chmod ug+x .husky/*
chmod ug+x .git/hooks/*