【发布时间】:2012-01-25 18:51:07
【问题描述】:
如果您在以下位置看到已接受的答案:
Aggregating and uglifying JavaScript in a Git pre-commit hook,你会看到我必须在我的 pre-commit 钩子上做一个 chmod +x 才能让它工作。
为什么 Git 默认不能执行?
【问题讨论】:
如果您在以下位置看到已接受的答案:
Aggregating and uglifying JavaScript in a Git pre-commit hook,你会看到我必须在我的 pre-commit 钩子上做一个 chmod +x 才能让它工作。
为什么 Git 默认不能执行?
【问题讨论】:
因为文件默认是不可执行的;它们必须设置为可执行。
来自git init 的示例文件都是可执行的;如果它被复制或重命名为非示例文件,它将保留原始文件的x 标志。
将使用当前默认值创建新文件。在您的情况下,使用 umask 查看这些默认值:
$ umask
0022
默认情况下,新文件不会是u+x,除非明确设置为。
【讨论】:
git init 来重新初始化回购,但仍然没有用。我在 TextMate 中编辑了文件,这可能是问题所在,但仍然没有解释为什么 git init 不能正确执行 chmod u+x。
git init 仅创建示例挂钩,而不是实际挂钩。我在 Lion 上运行 1.7.5.4,在 Ubuntu 上运行 1.7.0——它们都将示例文件创建为 u+x——我想我有点怀疑它不在你的身上。
chmod吗?
我必须在我的 pre-commit 钩子上做一个
chmod +x才能让它工作
问题在于首先意识到它是不可执行的。
使用 Git 2.15.x/2.16(2018 年第一季度)会更容易
参见Damien Marié (mdamien)commit f805a00(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。
【讨论】:
chmod +x .git/hooks/pre-commit 在 macOS 10.13.3 上为我工作。
作为一个附加的答案,这里是一个函数,你可以用来初始化一个 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
}
我和你一样对同样的事情感到恼火。我不想记住每次初始化存储库时都必须使所有钩子可执行。另外,当你使用submodules时,它们的钩子不在.git/hooks,而是在.git/modules/NameOfSubmodule/hooks,这些也应该是可执行文件。
【讨论】:
我有同样的症状,但完全不同的原因:
除了通过chmod +x .git/hooks/pre-commit 设置正确的权限位之外,请确保您的文件系统 以允许这些更改的方式安装。例如,当您有一个双引导系统时,这可能是一个问题,您在 Linux 下使用 ntfs-3g 安装的 Windows 驱动器工作。
您可以通过更改 /etc/fstab 或 systemd 等效项中的默认权限来修复它。
【讨论】:
我的背景 - Web 开发 Node.js。我需要添加 husky 功能,但出现错误,可能是磁盘访问。这对我的情况有所帮助:
chmod ug+x .husky/*
chmod ug+x .git/hooks/*
【讨论】: