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

運用上、どうしても大量のコミットを一度に`cherry-pick`する必要があったので、それを実行するスクリプト作成のスクリプトを作ってみたところ、シンプルな割に思ったより使いやすかったので紹介

# スクリプト

コメントいれてもたったの23行

```bash
#!/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`に書き出す
- 書き出した内容を全てコメントアウト（※先頭に`#`を付与）
- 各ログの項目の[コミットハッシュ値]を`git cherry-pick [コミットハッシュ値]`に置換  
※`#commit`を`git cherry-pick`に置換
- 「1」〜「3」の内容を`git_cherrypick.sh`として、カレントディレクトリに生成


# 使い方

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

1. 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 よく使うオプションまとめ](http://qiita.com/take4s5i/items/15d8648405f4e7ea3039)
[覚えておきたいbashシェルスクリプトのオプション](http://heartbeats.jp/hbblog/2010/09/bash.html)


## 使用例

例えば、こんなコミットログがあるとする

```git
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のルートディレクトリにて、)スクリプトを適当なファイルにコピペし、以下を実行する

```bash
# 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が発生した項目までコメントアウトし、再度実行すれば良い