这个问题说明了一切。有没有办法在合并之前执行一个操作?我猜有办法使用pre-commit钩子,但我不太确定。
pre-commit
shstlldc1#
您可以尝试使用prepare-commit-msg挂钩。第二个参数将是merge“如果提交是合并或存在.git/MERGE_MSG文件”。非零退出状态将中止提交。我不认为这将与快进合并一起工作,因为不会有提交消息。有关挂钩的更多信息:https://www.kernel.org/pub/software/scm/git/docs/githooks.html#_prepare_commit_msg
prepare-commit-msg
merge
.git/MERGE_MSG
eit6fx6z2#
在Git 2.24(Q4 2019)中,不需要脚本 Package 器或准备消息钩子。引入了新的“pre-merge-commit”挂接。参见Michael J Gruber ( mjg )的commit bc40ce4、commit 6098817、commit a1f3dd7(2019年8月7日)。参见Josh Steadmon ( steadmon )的commit f78f6c7(2019年8月7日)。(由Junio C Hamano -- gitster --合并至commit f76bd8c,2019年9月18日)
mjg
steadmon
gitster
git-merge
pre-merge-commit
git-merge在执行自动合并提交时不荣誉pre-commit钩子,出于兼容性的原因,这将继续存在。引入一个pre-merge-commit钩子,自动合并提交调用该钩子,就像非自动合并提交(或任何其他提交)调用预提交一样。文档现在包括:
此挂接由git-merge调用。它不带任何参数,在成功执行合并之后、获取建议的提交日志消息以进行提交之前调用。以非零状态退出此脚本会导致git merge命令在创建提交 * 之前 * 中止。默认的“pre-merge-commit "挂接在启用时运行”pre-commit“挂接(如果后者已启用)。如果该命令不会打开编辑器来修改提交消息,则使用环境变量GIT_EDITOR=:调用此挂接。如果无法自动执行合并,则需要解决冲突并单独提交结果(请参见git-merge)。此时,将不会执行此挂接,但如果启用了“pre-commit”挂接,则会执行该挂接。在Git 2.36(Q2 2022)中,run_commit_hook()的调用者会知道它之所以“成功”是因为钩子成功了还是因为没有钩子。参见Ævar Arnfjörð Bjarmason ( avar )的commit a8cc594、commit 9f6e63b(2022年3月7日)。(2022年3月16日由Junio C Hamano -- gitster --合并至commit 7431379)第1331章:不要在--no-verify上运行挂接后逻辑签署人:埃瓦·阿恩菲约德·比贾马森修复bc40ce4中引入的一个小错误(“merge:--no-verify to bypass pre-merge-commit hook”,2019-08-07,Git v2.24.0-rc 0--batch #3中列出的merge),当该更改使--no-verify选项绕过pre-merge-commit hook时,它没有更新相应的find_hook()(后来的hook_exists())条件。正如在前面的6098817中的提交(“git-merge:荣誉预合并提交钩子”,2019-08-07,Git v2.24.0-rc 0--merge在batch #3中列出)两者应该齐头并进。如果钩子不可能更新索引,那么在这里调用discard_cache()是没有意义的。我们在这里使用"hook_exist()“是有缺陷的,正如在随后的提交中所讨论的,它受到我们即将修复的模糊的争用条件的影响,但现在这个变化是一个严格的改进,保留了与"hooks_exist()“原样”使用有关的任何警告。警告:评论中的Devin Rhode报告(2022年11月):我想我实际上发现了一个错误,即pre-merge-commit钩子没有运行。请参阅PR“Git的pre-merge-commit钩子不起作用(至少在core.hooksPath上)”
git merge
GIT_EDITOR=:
run_commit_hook()
avar
--no-verify
find_hook()
hook_exists()
discard_cache()
"hook_exist()
"hooks_exist()
core.hooksPath
gr8qqesn3#
另一个很好的解决方法是添加一个shell脚本,按照您想要的方式调用它,然后将以下行添加到脚本中:
git() { if [ "$1" == "merge" ]; then echo "seems to work like a charme" fi command git "$@" } git "$@"
然后做一个
alias git="./my-pre-merge-script.sh"
然后你就可以开始了。你刚刚添加了你自己的pre-merge钩子。我知道,你不能访问git传递给真实的的pre-merge钩子的任何参数,但是你可以准备文件或者任何你想准备合并的东西;我个人对这种方法非常满意:我花了2到3天的时间来寻找预合并的东西,然后我不得不去与预提交消息,我没有找到足够准确的我的需要。这解决了我所有的问题。希望这有助于任何人在未来。
3条答案
按热度按时间shstlldc1#
您可以尝试使用
prepare-commit-msg
挂钩。第二个参数将是merge
“如果提交是合并或存在.git/MERGE_MSG
文件”。非零退出状态将中止提交。我不认为这将与快进合并一起工作,因为不会有提交消息。
有关挂钩的更多信息:https://www.kernel.org/pub/software/scm/git/docs/githooks.html#_prepare_commit_msg
eit6fx6z2#
在Git 2.24(Q4 2019)中,不需要脚本 Package 器或准备消息钩子。
引入了新的“pre-merge-commit”挂接。
参见Michael J Gruber (
mjg
)的commit bc40ce4、commit 6098817、commit a1f3dd7(2019年8月7日)。参见Josh Steadmon (
steadmon
)的commit f78f6c7(2019年8月7日)。(由Junio C Hamano --
gitster
--合并至commit f76bd8c,2019年9月18日)git-merge
:荣誉pre-merge-commit
挂钩git-merge
在执行自动合并提交时不荣誉pre-commit钩子,出于兼容性的原因,这将继续存在。引入一个
pre-merge-commit
钩子,自动合并提交调用该钩子,就像非自动合并提交(或任何其他提交)调用预提交一样。文档现在包括:
合并前提交
此挂接由
git-merge
调用。它不带任何参数,在成功执行合并之后、获取建议的提交日志消息以进行提交之前调用。
以非零状态退出此脚本会导致
git merge
命令在创建提交 * 之前 * 中止。默认的“pre-merge-commit "挂接在启用时运行”pre-commit“挂接(如果后者已启用)。
如果该命令不会打开编辑器来修改提交消息,则使用环境变量
GIT_EDITOR=:
调用此挂接。如果无法自动执行合并,则需要解决冲突并单独提交结果(请参见
git-merge
)。此时,将不会执行此挂接,但如果启用了“
pre-commit
”挂接,则会执行该挂接。在Git 2.36(Q2 2022)中,
run_commit_hook()
的调用者会知道它之所以“成功”是因为钩子成功了还是因为没有钩子。参见Ævar Arnfjörð Bjarmason (
avar
)的commit a8cc594、commit 9f6e63b(2022年3月7日)。(2022年3月16日由Junio C Hamano --
gitster
--合并至commit 7431379)第1331章:不要在
--no-verify
上运行挂接后逻辑签署人:埃瓦·阿恩菲约德·比贾马森
修复bc40ce4中引入的一个小错误(“
merge
:--no-verify
to bypass pre-merge-commit hook”,2019-08-07,Git v2.24.0-rc 0--batch #3中列出的merge),当该更改使--no-verify
选项绕过pre-merge-commit
hook时,它没有更新相应的find_hook()
(后来的hook_exists()
)条件。正如在前面的6098817中的提交(“
git-merge
:荣誉预合并提交钩子”,2019-08-07,Git v2.24.0-rc 0--merge在batch #3中列出)两者应该齐头并进。如果钩子不可能更新索引,那么在这里调用
discard_cache()
是没有意义的。我们在这里使用
"hook_exist()
“是有缺陷的,正如在随后的提交中所讨论的,它受到我们即将修复的模糊的争用条件的影响,但现在这个变化是一个严格的改进,保留了与"hooks_exist()
“原样”使用有关的任何警告。警告:评论中的Devin Rhode报告(2022年11月):
我想我实际上发现了一个错误,即pre-merge-commit钩子没有运行。
请参阅PR“Git的pre-merge-commit钩子不起作用(至少在
core.hooksPath
上)”gr8qqesn3#
另一个很好的解决方法是添加一个shell脚本,按照您想要的方式调用它,然后将以下行添加到脚本中:
然后做一个
然后你就可以开始了。你刚刚添加了你自己的pre-merge钩子。我知道,你不能访问git传递给真实的的pre-merge钩子的任何参数,但是你可以准备文件或者任何你想准备合并的东西;我个人对这种方法非常满意:我花了2到3天的时间来寻找预合并的东西,然后我不得不去与预提交消息,我没有找到足够准确的我的需要。这解决了我所有的问题。希望这有助于任何人在未来。