在`git revert --continue`期间绕过预提交挂钩

Gee*_*ort 18 git

我正在做一个git revert(之前的恢复),这导致了一些合并冲突.在解决冲突后,我的预提交钩子抛出了一些代码嗅探器问题.

由于这些代码嗅探器通知在别处被修复,我想在此时绕过预提交钩子git revert --continue --no-verify,显然git revert没有--no-verify子命令.

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

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

kel*_*vin 7

更换挂钩

如果您能够更改挂钩,则只需为每个挂钩添加一个切换开关即可。或如注释所述, 仅使用脚本临时重命名给定的挂钩

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

承诺

如果不适用,则有另一种选择:

通常,当某个操作因冲突而停止时,修复该错误后,您就可以运行

git commit
Run Code Online (Sandbox Code Playgroud)

代替

git $operation --continue
Run Code Online (Sandbox Code Playgroud)

这适用于revertmergecherry-pick和其他可能的(虽然rebase它可能会表现不同,因为它是操作的顺序)。

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

git commit --no-verify
Run Code Online (Sandbox Code Playgroud)

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

通过strace git commit和的区别strace 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
Run Code Online (Sandbox Code Playgroud)

但是结果似乎是相同的:他们用git生成的消息打开编辑器(例如:“ This reverts commit [...]”),然后退出后提交。我已经多次使用替代形式,至少没有任何问题(顺便说一句,我很可能在相同的情况下发现了它)。


Daa*_*aan 7

如果您处于某种状态,则可以检查预提交挂钩的内部。根据该检查,您可以中止脚本。当以下命令分别处于恢复、合并和变基状态时,将返回一个哈希值:

git rev-parse -q --verify REVERT_HEAD
git rev-parse -q --verify MERGE_HEAD
git rev-parse -q --verify REBASE_HEAD
Run Code Online (Sandbox Code Playgroud)

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

#!/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
Run Code Online (Sandbox Code Playgroud)