【问题标题】:Bypass pre-commit hook during `git revert --continue`在 `git revert --continue` 期间绕过预提交挂钩
【发布时间】:2015-12-10 07:07:25
【问题描述】:

我正在执行git revert(之前的还原),这导致了一些合并冲突。 解决冲突后,我的预提交挂钩引发了一些代码嗅探器问题。

由于这些代码嗅探器通知已在其他地方修复,因此我想在此时使用git revert --continue --no-verify 绕过预提交挂钩,显然git revert 没有--no-verify 子命令。

git revert 确实有一个--no-commit 子命令,但这不能与--continue 结合使用。

我最终重命名了 pre-commit 文件,但出于好奇。那时有没有更好的方法来绕过预提交钩子?

【问题讨论】:

  • 也有同样的问题并像你一样解决了它:我创建了一个文件hooks.sh,它接受一个参数:enabledisable。在喂disable 时,我使用我的预提交钩子并将其重命名为pre-commit.disabled。完成后,我调用 ./hooks.sh enable 将文件重命名为 pre-commit
  • 是的,唯一的选择是删除 hooks 目录,执行 git revert --continue 然后执行 git reset --hard HEAD。
  • 你也可以暂时关闭你的 git 钩子:git git config core.hooksPath "",然后在你完成 revert --continue 之后,用 git config core.hooksPath hooks/ 重新打开它(假设你的钩子路径是 @ 987654339@)。如果您只想关闭 precommit 钩子(例如,希望您的 postcommit 钩子仍然运行),这将不起作用。

标签: git


【解决方案1】:

更换挂钩

如果您能够更改 挂钩,您只需 add a toggle 为每个 一。或者只是使用脚本临时重命名给定的hookas commented.

任何一种方式都会选择性地跳过有问题的hook,同时让 其他的运行正常。这可确保发生其他检查(如果存在), 例如使用commit-msg hook 进行提交消息验证。

提交

如果不适用,还有一个替代方案:

通常,当一个操作因冲突而停止时,在修复它之后,您可以 跑吧

git commit

而不是

git $operation --continue

这适用于revertmergecherry-pick 以及可能的其他人(尽管 在rebase 中,它的行为可能有所不同,因为它是一系列操作)。

因此,如上所述,要绕过 钩子,您只需添加 --no-verify

git commit --no-verify

注意:上面的功能似乎没有记录,但它 WorksForMe(tm)。

strace git commitstrace git revert --continue 的差异来看, 前者做了很多其他事情(分别为 515 和 173 行),例如 检查是否正在进行变基并在其中创建一些临时文件 $GIT_DIR/objects。示例:

stat(".git/MERGE_HEAD", 0x7ffefb5d0760) = -1 ENOENT (No such file or directory)
stat(".git/rebase-apply", 0x7ffefb5d0620) = -1 ENOENT (No such file or directory)
stat(".git/rebase-merge", 0x7ffefb5d0620) = -1 ENOENT (No such file or directory)
stat(".git/CHERRY_PICK_HEAD", 0x7ffefb5d0760) = -1 ENOENT (No such file or directory)
stat(".git/BISECT_LOG", 0x7ffefb5d0620) = -1 ENOENT (No such file or directory)
stat(".git/REVERT_HEAD", {st_mode=S_IFREG|0644, st_size=41, ...}) = 0
lstat(".git/REVERT_HEAD", {st_mode=S_IFREG|0644, st_size=41, ...}) = 0
openat(AT_FDCWD, ".git/REVERT_HEAD", O_RDONLY) = 4

但结果似乎是一样的:他们用 git 生成的消息(例如:“This reverts commit [...]”)并在之后提交 退出。我已经多次使用替代形式,但从未有过 至少有问题(顺便说一下,我可能在相同的情况下发现了它 场景)。

【讨论】:

    【解决方案2】:

    如果您处于某种状态,则可以检查您的预提交钩子内部。根据该检查,您可以中止脚本。以下命令将分别在 revert、merge 和 rebase 中处于这样的状态时返回一个哈希:

    git rev-parse -q --verify REVERT_HEAD
    git rev-parse -q --verify MERGE_HEAD
    git rev-parse -q --verify REBASE_HEAD
    

    这就是我在预提交挂钩中使用其中两个的方式:

    #!/bin/sh
    
    IN_MERGE=$(git rev-parse -q --verify MERGE_HEAD)
    if [ "$IN_MERGE" != "" ]
    then
        exit 0;
    fi
    
    IN_REBASE=$(git rev-parse -q --verify REBASE_HEAD)
    if [ "$IN_REBASE" != "" ]
    then
        exit 0;
    fi
    

    【讨论】:

      猜你喜欢
      • 2019-12-25
      • 2011-11-06
      • 1970-01-01
      • 2021-09-10
      • 2013-12-24
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多