git commit.'merge --squash'时未使用模板

tjvv9vkg  于 2023-03-16  发布在  Git
关注(0)|答案(2)|浏览(123)

bounty将在4天后过期。回答此问题可获得+200声望奖励。buhtz希望引起更多人关注此问题。

commit.template中的消息模板仅用于new提交,因此在执行git merge --squash mybranch && git commit -a时没有使用它。
有没有类似merge.template或其他解决方案的东西,我可以修改默认消息,显示在编辑器中时,做合并?
∮我在普通提交中看到的
在执行git commit -a时,在我选择的编辑器中打开此对话框:

  1. This is my commit message template set via "git config commit.template".
  2. # Bitte geben Sie eine Commit-Beschreibung für Ihre Änderungen ein. Zeilen,
  3. # die mit '#' beginnen, werden ignoriert, und eine leere Beschreibung
  4. # bricht den Commit ab.
  5. #
  6. # Auf Branch main
  7. # Ihr Branch ist auf demselben Stand wie 'origin/main'.
  8. #
  9. # Zum Commit vorgemerkte Änderungen:
  10. # geändert: README.md
  11. #
  12. # Unversionierte Dateien:
  13. # my-commit-msg-tempalte

git merge --squash之后我看到了什么

这出现在我选择的编辑器中,当做git merge --squash myfix && git commit -a的时候。模板消息不在那里!

  1. Squashed commit of the following:
  2. commit 9474d601e6b3ed33efc432f623c08e7931095ba0
  3. Author: buhtz <c.buhtz@posteo.jp>
  4. Date: Mon Mar 13 09:22:33 2023 +0100
  5. commit three
  6. commit 2f6524da10a6c3fba8963761abcd3b5ba3d19f12
  7. Author: buhtz <c.buhtz@posteo.jp>
  8. Date: Mon Mar 13 09:22:25 2023 +0100
  9. commit two
  10. commit 5520ea8e2e75a29e06322a742a4b40dbbb74b3ee
  11. Author: buhtz <c.buhtz@posteo.jp>
  12. Date: Mon Mar 13 09:22:17 2023 +0100
  13. commit one
  14. # Bitte geben Sie eine Commit-Beschreibung für Ihre Änderungen ein. Zeilen,
  15. # die mit '#' beginnen, werden ignoriert, und eine leere Beschreibung
  16. # bricht den Commit ab.
  17. #
  18. # Auf Branch main
  19. # Ihr Branch ist 1 Commit vor 'origin/main'.
  20. # (benutzen Sie "git push", um lokale Commits zu publizieren)
  21. #
  22. # Zum Commit vorgemerkte Änderungen:
  23. # geändert: README.md
  24. # geändert: spiel.py
  25. #
  26. # Unversionierte Dateien:
  27. # my-commit-msg-tempalte

∮我想要的∮
在做了git merge --squash myfix && git commit -a之后,我希望我的编辑器能在模板所在的地方产生这样的东西。压缩提交消息是一个很好的东西,但对我来说不是强制性的。

  1. This is my commit message template set via "git config commit.template".
  2. Squashed commit of the following:
  3. commit 9474d601e6b3ed33efc432f623c08e7931095ba0
  4. Author: buhtz <c.buhtz@posteo.jp>
  5. Date: Mon Mar 13 09:22:33 2023 +0100
  6. commit three
  7. commit 2f6524da10a6c3fba8963761abcd3b5ba3d19f12
  8. Author: buhtz <c.buhtz@posteo.jp>
  9. Date: Mon Mar 13 09:22:25 2023 +0100
  10. commit two
  11. commit 5520ea8e2e75a29e06322a742a4b40dbbb74b3ee
  12. Author: buhtz <c.buhtz@posteo.jp>
  13. Date: Mon Mar 13 09:22:17 2023 +0100
  14. commit one
  15. # Bitte geben Sie eine Commit-Beschreibung für Ihre Änderungen ein. Zeilen,
  16. # die mit '#' beginnen, werden ignoriert, und eine leere Beschreibung
  17. # bricht den Commit ab.
  18. #
  19. # Auf Branch main
  20. # Ihr Branch ist 1 Commit vor 'origin/main'.
  21. # (benutzen Sie "git push", um lokale Commits zu publizieren)
  22. #
  23. # Zum Commit vorgemerkte Änderungen:
  24. # geändert: README.md
  25. # geändert: spiel.py
  26. #
  27. # Unversionierte Dateien:
  28. # my-commit-msg-tempalte
qij5mzcb

qij5mzcb1#

虽然某些Git仓库远程托管服务like GitLab可能会提供适当的合并消息模板,但您需要一个本地钩子来修改合并消息。
例如,prepare_commit_msg本地挂接(Git 2.24+, Q4 2019
它需要一到三个参数。

  • 第一个是包含提交日志消息的文件的名称。
  • 第二个是提交消息的来源,可以是:
  • message(如果给出了-m-F选项);
  • template(如果给出了-t选项或设置了配置选项commit.template);
  • 或:
  • merge(如果提交是合并或者存在.git/MERGE_MSG文件);
  • squash(如果存在.git/SQUASH_MSG文件);或
  • commit,后跟提交对象名称(如果给定了-c-C--amend选项)。

在这个钩子中,您可以(当第二个参数是mergesquash时)编写一个脚本,将merge.template与当前的squash消息组合在一起。

  • 模板的内容位于git config commit.template引用的文件中。
  • 要更新以修改提交消息的文件为.git/MERGE_MSG.git/SQUASH_MSG(在您的情况下:后者)。

但是修改.git/SQUASH_MSG并退出0,由git merge --squash创建的合并压缩提交将集成提交模板。
为了说明这一点,我不想修改提交或提交消息,我想在完成合并压缩和提交后打开带有提交消息模板的编辑器。
那么您的prepare_commit_msg钩子就可以像这样简单:

  1. #!/bin/bash
  2. if [[ ! -e ".git/SQUASH_MSG" ]]; then exit 0; fi
  3. # append the commit template after the default squash message
  4. cat "$(git config commit.template)" >> ".git/SQUASH_MSG"
  5. $EDITOR ".git/SQUASH_MSG"

这将把模板放到准备好的提交消息中,并打开编辑器。
编辑器关闭后,修改后的.git/SQUASH_MSG将用于最终提交。
在这种情况下,不需要git commit -a

展开查看全部
uplii1fm

uplii1fm2#

当你执行git merge --squash时,一个包含新提交信息的文件被写入.git/SQUASH_MSG,它优先于你的提交模板,并且没有任何选项可以覆盖它。
您可以在合并后简单地删除该文件。
有很多方法可以帮助您删除该文件,但最简单的方法是创建一个别名来为您执行此操作:

  1. git config --global alias.my-merge-squash \
  2. '!f() { git merge --squash $@ && rm -f .git/SQUASH_MSG; }; f'

现在您可以执行git my-merge-squash mybranch而不是git merge --squash mybranch
你可以给你的别名取任何你喜欢的名字,比如ms
但如果您通常在每次合并后执行git commit -a,则可以配置别名以同时执行所有操作:

  1. git config --global alias.msc \
  2. '!f() { git merge --squash $@ && rm -f .git/SQUASH_MSG && git commit -a; }; f'

应该可以在squash消息前面添加模板,但这需要编写一个脚本并将其添加到$PATH中。如果您对此感兴趣,请在评论中告诉我。

相关问题