跳过Git提交钩子

iyfjxgzm  于 2023-01-01  发布在  Git
关注(0)|答案(7)|浏览(209)

我在看一个Git钩子,它在Python代码中寻找print语句,如果找到了print语句,它就会阻止Git提交。
我想覆盖这个钩子,但我被告知有一个命令可以这么做。我一直没能找到它。有什么想法吗?

4jb9z9bj

4jb9z9bj1#

可能(来自git commit man page):

git commit --no-verify -m "commit message"
           ^^^^^^^^^^^
-n  
--no-verify

这个选项绕过了pre-commit和commit-msg钩子。
正如Blaise所评论的,-n对于某些命令可以具有不同的角色。
例如,git push -n实际上是一个预演推送。
只有git push --no-verify会跳过钩子。
注意:Git 2.14.x/2.15改进了--no-verify的行为:
参见Kevin Willford (``)commit 680ee55(2017年8月14日)。
(由Junio C Hamano -- gitster --合并至commit c3e034f,2017年8月23日)

commit:如果没有pre-commit挂接,则跳过丢弃索引

"git commit",用于丢弃索引并从文件系统重新读取,以防pre-commit钩子在中间更新了索引;当我们知道我们不运行pre-commit钩子时,这已经被优化了。
Davi Lima在注解中指出git cherry-pick * 不 * 支持--no-verify。
因此,如果一个cherry-pick触发了一个pre-commit钩子,你可能需要像在this blog post中那样,以某种方式注解/禁用那个钩子,这样git cherry-pick才能继续。
git rebase --continue的情况下,在合并冲突解决之后,将需要相同的过程。
在Git 2.36(Q2 2022)中,run_commit_hook()的调用者可以了解它获得"成功"是因为钩子成功了还是因为没有钩子。
请参见commit a8cc594(与commit 4369e3a1一起修复)、commit 9f6e63b(2022年3月7日)和Ævar Arnfjörð Bjarmason ( avar )
(由Junio C Hamano -- gitster --合并至commit 7431379,2022年3月16日)

hooks:修复模糊的**TOCTOU**"我们刚才是否运行了钩子?"比赛

签署人:埃瓦尔·阿恩菲约德·比亚尔马森
修复680ee55中添加的代码中的Time-of-check to time-of-use (TOCTOU)竞争("commit:如果没有预提交钩子,跳过丢弃索引",2017 - 08 - 14,Git v2.15.0-rc0--merge列于batch #3中)。
例如,如果我们运行"pre-commit"钩子并且它修改了索引,但是hook_exists()稍后返回假(例如,因为钩子本身消失,目录变得不可读,等等),则可能发生这种模糊的竞争条件。
那么我们就不会在应该调用discard_cache()的时候调用它。
争用条件本身可能并不重要,用户在实践中也不太可能遇到它。
680ee55was discussed时,此问题已记录在列表中,但尚未修复。
让我们也为push-to-checkout挂钩更改此设置。
现在,我们不再检查钩子是否存在,也不再执行push to checkout或push to deploy,而是总是尝试push to checkout。
如果钩子不存在,我们将退回到推动部署。
和以前一样的行为,没有TOCTOU比赛。
参见0855331("receive-pack:支持一键结账钩子",2014 - 12 - 01,Git v2.4.0-rc0--merge),介绍了之前的行为。
这就剩下hook_exists()在两个重要的地方的使用了。
refs.c中的"参考交易"检查,参见6754159("refs:实现引用事务钩子",2020年6月19日,Git v2.28.0-rc0--batch #7中列出的merge),以及"准备-提交-消息"钩子,参见66618a5(" sequencer:运行"准备-提交-消息"钩子",2018年1月24日,Git v2.17.0-rc0--在batch #2中列出)。
在这两种情况下,我们都通过不为钩子准备数据来节省CPU时间,如果没有钩子,我们将什么也不做。
因此,在这些情况下使用"invoked_hook"模式没有意义。
"reference-transaction"和"prepare-commit-msg"钩子也不太活泼。
在这些情况下,如果我们与添加的新钩子竞争,我们将跳过钩子运行,而在这里修复的TOCTOU竞争中,我们错误地跳过了所需的钩子后逻辑。

zu0ti5jz

zu0ti5jz2#

同时使用commentno verify,没有任何其他问题:

git commit -m "Some comments" --no-verify
ozxc1zmp

ozxc1zmp3#

man githooks开始:
预提交
这个钩子由git commit调用,可以通过--no-verify选项绕过。它不带参数,在获取提交日志消息并提交之前调用。以非零状态退出此脚本会导致git commit中止。

zvokhttg

zvokhttg4#

--no-verify可以工作,但在我的例子中,我不想一直将参数放在终端上,所以我选择了更主动一些的方法。
如果您想全局禁用git hooks,可以尝试运行以下命令:

git config --global core.hooksPath /dev/null

但是,如果您想让它保持原样,只需在您的终端中运行以下命令:

git config --global --unset core.hooksPath

如果您不希望它是全局的,只需删除该参数:--global
我用Git 2.16.3测试了它。

eblbsuwk

eblbsuwk5#

  • -n* 或 --no-verify 不适用于'git merge --continue'之后的提交。

这里有另一个粗略的想法。
1.仅**文件 * .git/hooks/pre-commit中带有符号“#”的注解行。
1.运行单个或多个命令
1.取消注解
1.利润。

h7appiyu

h7appiyu6#

由于某种原因,--no-verify不适合我使用这个特定的钩子:prepare-commit-msg
如果您也遇到此问题,请尝试:

SKIP=prepare-commit-msg git commit
qlfbtfca

qlfbtfca7#

你也可以暂时从项目目录中卸载预提交。我正在使用一个GUI应用程序来合并,所以不能使用-n标志,注解掉行也不起作用。

pre-commit uninstall

并在完成后重新安装

pre-commit install

相关问题