我在看一个Git钩子,它在Python代码中寻找print语句,如果找到了print语句,它就会阻止Git提交。我想覆盖这个钩子,但我被告知有一个命令可以这么做。我一直没能找到它。有什么想法吗?
4jb9z9bj1#
可能(来自git commit man page):
git commit
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日)
-n
git push -n
git push --no-verify
--no-verify
gitster
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日)
git cherry-pick
git rebase --continue
run_commit_hook()
avar
hooks
签署人:埃瓦尔·阿恩菲约德·比亚尔马森修复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竞争中,我们错误地跳过了所需的钩子后逻辑。
hook_exists()
discard_cache()
receive-pack
refs.c
refs
sequencer
"invoked_hook"
reference-transaction
prepare-commit-msg
zu0ti5jz2#
同时使用comment和no verify,没有任何其他问题:
comment
no verify
git commit -m "Some comments" --no-verify
ozxc1zmp3#
从man githooks开始:预提交这个钩子由git commit调用,可以通过--no-verify选项绕过。它不带参数,在获取提交日志消息并提交之前调用。以非零状态退出此脚本会导致git commit中止。
man githooks
zvokhttg4#
--no-verify可以工作,但在我的例子中,我不想一直将参数放在终端上,所以我选择了更主动一些的方法。如果您想全局禁用git hooks,可以尝试运行以下命令:
git hooks
git config --global core.hooksPath /dev/null
但是,如果您想让它保持原样,只需在您的终端中运行以下命令:
git config --global --unset core.hooksPath
如果您不希望它是全局的,只需删除该参数:--global我用Git 2.16.3测试了它。
--global
eblbsuwk5#
这里有另一个粗略的想法。1.仅**文件 * .git/hooks/pre-commit中带有符号“#”的注解行。1.运行单个或多个命令1.取消注解1.利润。
.git/hooks/pre-commit
h7appiyu6#
由于某种原因,--no-verify不适合我使用这个特定的钩子:prepare-commit-msg如果您也遇到此问题,请尝试:
SKIP=prepare-commit-msg git commit
qlfbtfca7#
你也可以暂时从项目目录中卸载预提交。我正在使用一个GUI应用程序来合并,所以不能使用-n标志,注解掉行也不起作用。
pre-commit uninstall
并在完成后重新安装
pre-commit install
7条答案
按热度按时间4jb9z9bj1#
可能(来自
git commit
man page):这个选项绕过了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竞争中,我们错误地跳过了所需的钩子后逻辑。
zu0ti5jz2#
同时使用
comment
和no verify
,没有任何其他问题:ozxc1zmp3#
从
man githooks
开始:预提交
这个钩子由git commit调用,可以通过--no-verify选项绕过。它不带参数,在获取提交日志消息并提交之前调用。以非零状态退出此脚本会导致git commit中止。
zvokhttg4#
--no-verify
可以工作,但在我的例子中,我不想一直将参数放在终端上,所以我选择了更主动一些的方法。如果您想全局禁用
git hooks
,可以尝试运行以下命令:但是,如果您想让它保持原样,只需在您的终端中运行以下命令:
如果您不希望它是全局的,只需删除该参数:
--global
我用Git 2.16.3测试了它。
eblbsuwk5#
这里有另一个粗略的想法。
1.仅**文件 *
.git/hooks/pre-commit
中带有符号“#”的注解行。1.运行单个或多个命令
1.取消注解
1.利润。
h7appiyu6#
由于某种原因,
--no-verify
不适合我使用这个特定的钩子:prepare-commit-msg
如果您也遇到此问题,请尝试:
qlfbtfca7#
你也可以暂时从项目目录中卸载预提交。我正在使用一个GUI应用程序来合并,所以不能使用
-n
标志,注解掉行也不起作用。并在完成后重新安装