【问题标题】:Why is my Git pre-commit hook not executable by default?为什么我的 Git 预提交挂钩在默认情况下不可执行?
【发布时间】:2012-01-25 18:51:07
【问题描述】:

如果您在以下位置看到已接受的答案: Aggregating and uglifying JavaScript in a Git pre-commit hook,你会看到我必须在我的 pre-commit 钩子上做一个 chmod +x 才能让它工作。

为什么 Git 默认不能执行?

【问题讨论】:

    标签: git githooks


    【解决方案1】:

    因为文件默认是不可执行的;它们必须设置为可执行。

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

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

    $ umask
    0022
    

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

    【讨论】:

    • 我在 Mac OS X Lion 上运行 git v1.7.6。我已经完成了git init 来重新初始化回购,但仍然没有用。我在 TextMate 中编辑了文件,这可能是问题所在,但仍然没有解释为什么 git init 不能正确执行 chmod u+x
    • @JoshSmith git init 仅创建示例挂钩,而不是实际挂钩。我在 Lion 上运行 1.7.5.4,在 Ubuntu 上运行 1.7.0——它们都将示例文件创建为 u+x——我想我有点怀疑它不在你的身上。
    • 如果没有别的,我发现我的 Linux 机器运行的是旧版本的 git。
    • 那么我每次修改钩子时都必须chmod吗?
    • @JoshSmith 呃,不,一旦设置好了,你就不需要再更改它了。
    【解决方案2】:

    我必须在我的 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 上为我工作。
    • @JagdeepSingh 确实是这个想法。提示可能更明确。
    【解决方案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,这些也应该是可执行文件。

    【讨论】:

      【解决方案4】:

      我有同样的症状,但完全不同的原因:

      除了通过chmod +x .git/hooks/pre-commit 设置正确的权限位之外,请确保您的文件系统 以允许这些更改的方式安装。例如,当您有一个双引导系统时,这可能是一个问题,您在 Linux 下使用 ntfs-3g 安装的 Windows 驱动器工作。

      您可以通过更改 /etc/fstabsystemd 等效项中的默认权限来修复它。

      【讨论】:

        【解决方案5】:

        我的背景 - Web 开发 Node.js。我需要添加 husky 功能,但出现错误,可能是磁盘访问。这对我的情况有所帮助:

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

        【讨论】:

        • 是的,只有这个对我有用。
        • 来自"What is Husky?"“Husky 是一个工具,可以让我们轻松地处理 Git 挂钩并在这些阶段运行我们想要的脚本。”
        • 解释一下。例如,想法/要点是什么?为什么它有效?为什么需要group?这个 "husky" 是什么东西(例如,我只有 dot 文件夹 ".git"".vscode" 在我的存储库中)?这种变化对安全有什么影响?什么是上下文——某种网络开发?节点.js?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
        猜你喜欢
        • 2012-11-08
        • 2021-09-10
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-03
        • 2016-07-16
        • 1970-01-01
        相关资源
        最近更新 更多