git のマージコミットメッセージをカスタマイズするには?
質問
マージを行うたびに、マージコミットを生成する必要があります。このコミットには、すべてのコミットの概要だけでなく、もっと多くの情報を持たせたいと思います。
私の質問は、どのように 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-commit
と
commit -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関数がコンソールに書き出さず、ファイルにのみ書き出すようにします。
関連
-
git pushで "Updates were rejected because your current branch is behind "というエラーが報告される。
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] 既存の、プッシュされていないコミットメッセージを修正するには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] ファイルをリセットしたり、特定のリビジョンに戻したりするにはどうすればよいですか?
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み] コミットに含まれるすべてのファイルを一覧表示するにはどうすればよいですか?
-
[解決済み] 複数のコミットを1つのスクワッシュされたコミットとして別のブランチにマージするにはどうすればよいですか?
-
[解決済み】Git リポジトリに空のディレクトリを追加するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
fatal: リモート参照マスタが見つかりませんでした。
-
git commit コマンドで追跡した新規ファイルをコミットすると、プロンプト *** Please tell me who you are が表示されます。
-
gitlabの紹介と使い方
-
git push issues
-
[解決済み】デフォルトのブランチ名を "master" 以外にした Git リポジトリを作成するにはどうすればよいですか?
-
[解決済み] JenkinsのGitプラグイン。特定のタグをビルドするには?
-
[解決済み] gitにもsvnのような無視コマンドはありますか?
-
[解決済み] Git のリモート HEAD を master 以外に指定するように変更する
-
[解決済み] プル前にローカルとGitHubのリポジトリの差分を確認する方法 [重複]について
-
[解決済み] ファイル変更時のDockerコンテナの再構築