1. ホーム
  2. git

git のマージコミットメッセージをカスタマイズするには?

2023-10-30 20:26:12

質問

マージを行うたびに、マージコミットを生成する必要があります。このコミットには、すべてのコミットの概要だけでなく、もっと多くの情報を持たせたいと思います。

私の質問は、どのように git-fmt-merge-msg をフォーマットできるか、またはこの自動メッセージを決定するものは何かということです。 (私はコミット後にそれを修正し、git-log --pretty=format:'...' を使用することによって手動でこれを行うことができます)

例えば私はこのような書式にしたいと思います。

 Merge branch 'test'  
    * test:  
      [BZ: #123] fifth commit subject  
      [BZ: #123] fourth commit subject  
      [BZ: #123] third commit subject  
      [BZ: #123] second commit subject  
      [BZ: #123] first commit subject  

 __________________________________________
 Merge details:  
     [BZ: #123] fifth commit subject  
               at 2010-06-30 11:29:00 +0100  
       - fifth commit body  

     [BZ: #123] fourth commit subject  
               at 2010-06-30 11:22:17 +0100  
       - fourth commit body  

     [BZ: #123] third commit subject  
               at 2010-06-30 11:21:43 +0100  
       - third commit body  

     [BZ: #123] second commit subject  
               at 2010-06-30 11:21:30 +0100  
       - second commit body  

     [BZ: #123] first commit subject  
               at 2010-06-30 11:29:57 +0100  
       - first commit body

どのように解決するのですか?

このようなことをやってみたかったのです。私は合理的な方法を見つけられませんでした。 git fmt-merge-msg を動作させる合理的な方法は見つかりませんでした。私が期待していた方法(メッセージに使用する完全にカスタムなテキストを渡す)とは違うようです。そこで代わりに、私は -no-commitcommit -F コマンドを使用します。もちろん出力はカスタマイズ可能ですが、あなたが出力してほしいと言ったものをほぼ正確に反映しています。

コミットメッセージの出力例です。

Merge branch fix4 into master

::SUMMARY::
Branch fix4 commits:
Add fix4b-4
Add fix4b-3
Add fix4b-2
Add fix4b-1

Branch master commits:
fix4b-5 on master

* * * * * * * * * * * * * * * * * * * * * * * * *
::DETAILS::
commit < 98ffa579e14610b3566e1a3f86556a04dc95a82b
Author: -----
Date:   Fri Aug 17 17:23:26 2018 -0400

    fix4b-5 on master

commit > 7e386dddee16a7c2588954d25dd6793cdaa1b562
Author: -----
Date:   Fri Aug 17 15:18:17 2018 -0400

    Add fix4b-4

    use log output as commit message

    commit 2e630b1998312ec1093d73f9fe77b942407f45e8
    Author: -----
    Date:   Fri Aug 17 15:15:28 2018 -0400

        Add fix4b-3

commit > 2e630b1998312ec1093d73f9fe77b942407f45e8
Author: -----
Date:   Fri Aug 17 15:15:28 2018 -0400

    Add fix4b-3

commit > c9bb199be49c17ca739d019d749263314f05fc46
Author: -----
Date:   Fri Aug 17 15:15:27 2018 -0400

    Add fix4b-2

commit > 5b622a935c9d078c7d0ef9e195bccf1f98cce5e4
Author: -----
Date:   Fri Aug 17 15:15:27 2018 -0400

    Add fix4b-1

そして使い方はというと

$ git mergelogmsg branch-name

ここにエイリアスをコピーしておきます。

[alias]
    mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) && printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n' $1 $var $1 > temp_merge_msg && git log --format=format:'%s' $var..$1 >> temp_merge_msg && printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg && git log --format=format:'%s' $1..$var >> temp_merge_msg && printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg && git log --left-right $var...$1 >> temp_merge_msg && git merge --no-ff --no-commit $1 && git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f" 

コピー&ペーストでカスタマイズする場合は、上記を使用します。下のバージョンは改行があるので、いらないかもしれませんが、説明用に使ってみます。

[alias]
1   mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) && 
2        printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n' $1 $var $1 > temp_merge_msg && 
3        git log --format=format:'%s' $var..$1 >> temp_merge_msg && 
4        printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg && 
5        git log --format=format:'%s' $1..$var >> temp_merge_msg && 
6        printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg && 
7        git log --left-right $var...$1 >> temp_merge_msg && 
8        git merge --no-ff --no-commit $1 && 
9        git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f"

よし...

1行目 はカスタム関数をbashシェルスクリプトとして起動し、gitがそれがgitコマンドでないことを認識できるようにしています。これは現在のブランチ (別のブランチを master にマージしている場合は master) を変数に設定し、後でそれを使えるようにします。

2行目 は、現在のブランチと元のコマンドで与えたブランチ名を使って最初の行を表示します(通常のマージコマンドの場合と同様です)。これは一時ファイルに書き込まれます。

3行目 は、現在のブランチにない受信ブランチのコミットのログを取得し、それらのコミットのサブジェクトのみを temp ファイルに書き出します。

4行目 は次の行をtempに表示します。

5行目 は、現在のブランチにあるコミットのうち、入力ブランチにないコミットのログを取得し、それらのコミットのサブジェクトのみを temp ファイルに書き出します。

6行目 は、要約部分と詳細部分の間に小さな水平方向のセパレータを印字します。

7行目 は、現在のブランチと入力ブランチのすべてのコミットを、互いに分岐した直後、あるいは最後に祖先を共有した時点までさかのぼってログを取得します。左右の矢印は、そのコミットがどのブランチからのものかを示しています。

8行目 は入ってきたブランチに対して、早送りなし(つまりコミットを取得する)、コミットなし(つまり自分でコミットを書かなければならない...あ、でも書かない!)で、マージコマンドを実行します。

9行目 はコミットコマンドを -e-F パラメータを使用すると、編集が可能になり、指定したファイルのテキストをメッセージに入力するようにコミットに指示することができます。コミットメッセージを希望通りに仕上げると、マージをコミットし、一時ファイルを削除します。

タダ! 2つの ; は、printf関数がコンソールに書き出さず、ファイルにのみ書き出すようにします。