LoginSignup
0
0

More than 5 years have passed since last update.

gitにてcherry-pickをまとめて実行するスクリプトを作成するスクリプトを作ってみた

Last updated at Posted at 2016-08-10

運用上、どうしても大量のコミットを一度に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;

やってること

  1. git log --reverse [任意のオプション]git_cherrypick.shに書き出す
  2. 書き出した内容を全てコメントアウト(※先頭に#を付与)
  3. 各ログの項目の[コミットハッシュ値]をgit cherry-pick [コミットハッシュ値]に置換
    #commitgit cherry-pickに置換
  4. 「1」〜「3」の内容をgit_cherrypick.shとして、カレントディレクトリに生成

使い方

上記記載のスクリプトをコピペしたファイル名をmakeCherrypick.shとする

  1. git管理のディレクトリに移動
  2. git logを確認し、オプションを適当に指定したmakeCherrypick.shを実行する
    ./makeCherrypick.sh [git logの絞込用のオプション]
  3. 「2.」を実行するとカレントディレクトリにgit_cherrypick.shを作成する
  4. 実行権限をつけるchmod u+x git_cherrypick.sh
  5. git_cherrypick.shを適当に編集する(※しなくても良い)
  6. コミット付与対象のブランチに切替え、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が発生した項目までコメントアウトし、再度実行すれば良い

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0