運用上、どうしても大量のコミットを一度にcherry-pick
する必要があったので、それを実行するスクリプト作成のスクリプトを作ってみたところ、シンプルな割に思ったより使いやすかったので紹介
スクリプト
コメントいれてもたったの23行
#!/bin/bash
# git cherry-pick実行ファイル作成スクリプト
# ./makeCherrypick.sh [git logのオプション] の実行で
# カレントディレクトリにcherry pickするための実行ファイルを生成する
# ・cherry pickするコミットハッシュ値はgit logで出力した内容
# ・オプション未指定の場合は全ログを出力
# ・生成する実行ファイル名は「変数:exefilename」で指定した文字列
# ・生成する実行ファイルが存在している場合は上書きする
exefilename='git_cherrypick.sh';
ops=$@;
# 定型文入力
echo "#!/bin/bash -e" > ${exefilename};
echo "" >> ${exefilename};
# git logからコミットハッシュ値を抽出し、コマンド文を入力
if [ -n "${ops}" ]; then
git log --reverse ${ops} | sed 's/^/#/' | sed 's/#commit/git cherry-pick/' >> ${exefilename};
else
git log --reverse | sed 's/^/#/' | sed 's/#commit/git cherry-pick/' >> ${exefilename};
fi;
やってること
-
git log --reverse [任意のオプション]
をgit_cherrypick.sh
に書き出す - 書き出した内容を全てコメントアウト(※先頭に
#
を付与) - 各ログの項目の[コミットハッシュ値]を
git cherry-pick [コミットハッシュ値]
に置換
※#commit
をgit cherry-pick
に置換 - 「1」〜「3」の内容を
git_cherrypick.sh
として、カレントディレクトリに生成
使い方
上記記載のスクリプトをコピペしたファイル名をmakeCherrypick.sh
とする
- git管理のディレクトリに移動
-
git log
を確認し、オプションを適当に指定したmakeCherrypick.sh
を実行する
./makeCherrypick.sh [git logの絞込用のオプション]
- 「2.」を実行するとカレントディレクトリに
git_cherrypick.sh
を作成する - 実行権限をつける
chmod u+x git_cherrypick.sh
-
git_cherrypick.sh
を適当に編集する(※しなくても良い) - コミット付与対象のブランチに切替え、
git_cherrypick.sh
を実行
./git_cherrypick.sh
補足
- 「2」のgit logの絞込用のオプションは「git log 絞り込み」でググってもいいし、
git help log
でも確認できる - 「5」の編集では主に不要なコミットをコメントアウトする
- conflictが発生した場合はスクリプトが強制的に終了する
参考:
git log よく使うオプションまとめ
覚えておきたいbashシェルスクリプトのオプション
使用例
例えば、こんなコミットログがあるとする
commit 54115de6b9a2289ad08a8c862ceb13f87a97e22b
Author: sfuta <testtest@yahoo.co.jp>
Date: Wed Aug 10 14:48:38 2016 +0900
ファイル3追加
commit 264eaab2p547266c40fab3128543cca033ea4544
Author: sfuta <testtest@yahoo.co.jp>
Date: Wed Aug 10 14:46:30 2016 +0900
ファイル2追加
commit 9e61083bad3b513d7ff70833e7cb18172ae99a2d
Author: sfuta <testtest@yahoo.co.jp>
Date: Wed Aug 10 14:44:02 2016 +0900
ファイル編集
commit 4ca1a4b9b881aca7a87683b32aee1aae90f58e4f
Author: sfuta <testtest@yahoo.co.jp>
Date: Wed Aug 10 14:42:59 2016 +0900
ファイル追加
(gitのルートディレクトリにて、)スクリプトを適当なファイルにコピペし、以下を実行する
# 9e61083..はgit logの絞込を行うためのオプション(※この場合は9e61083後のコミットを取得する)
./makeCherrypick.sh 9e61083..
そうすると以下の様なgit cherry-pick
実行スクリプトファイルが作成される
git_cherrypick.sh
#!/bin/bash -e
git cherry-pick 264eaab2p547266c40fab3128543cca033ea4544
#Author: sfuta <testtest@yahoo.co.jp>
#Date: Wed Aug 10 14:46:30 2016 +0900
#
# ファイル2追加
#
git cherry-pick 54115de6b9a2289ad08a8c862ceb13f87a97e22b
#Author: sfuta <testtest@yahoo.co.jp>
#Date: Wed Aug 10 14:48:38 2016 +0900
#
# ファイル3追加
一度、作成されたファイルgit_cherrypick.sh
を中身を確認し、場合によっては不要なコミットを除く
git_cherrypick.sh
#!/bin/bash -e
#git cherry-pick 264eaab2p547266c40fab3128543cca033ea4544 <- 不要であればコメントアウト
#Author: sfuta <testtest@yahoo.co.jp>
#Date: Wed Aug 10 14:46:30 2016 +0900
#
# ファイル2追加
#
git cherry-pick 54115de6b9a2289ad08a8c862ceb13f87a97e22b
#Author: sfuta <testtest@yahoo.co.jp>
#Date: Wed Aug 10 14:48:38 2016 +0900
#
# ファイル3追加
あとはコミットを付与対象のブランチに切替え、作成されたgit_cherrypick.sh
を実行する
※実行権限がついていない可能性はあるので、場合によってはchmod u+x git_cherrypick.sh
を実行する
なお、conflictが発生した場合はスクリプトが強制的に終了するので、その場合はmerge作業後に
git_cherrypick.sh
にてconflictが発生した項目までコメントアウトし、再度実行すれば良い