Gemの一部をGemに切り出した手順メモ

あとでどこかに清書するための日本語版の端書で、RuboCop Core から RuboCop Performance と RuboCop Rails の別 Gem を切り出す際の手順メモ。

github.com

RuboCop Core から cp によるファイルコピーだっため git の履歴が飛んでいたのをどうにかしたかったのが動機。

まず lib ディレクトリと spec ディレクトリに対して cherry-pick が必要な作業数。RuboCop Performance と RuboCop Rails の算出。なお、ggitg となる。

% g log --oneline lib/rubocop/cop/performance spec/rubocop/cop/performance | wc -l
     225
% g log --oneline lib/rubocop/cop/rails spec/rubocop/cop/rails | wc -l
     315

まず数の少ない RuboCop Performance から行なった。RuboCop Rails はそれがうまく行ってからの作業としている。

既存リポジトリでも良いが、完全にやり直しの効くよう新たに一時作業用のリポジトリを立てていた。

mkdir rubocop-performance-revise
g init
g remote add upstream-performance https://github.com/rubocop-hq/rubocop-performance
g remote add upstream-core https://github.com/rubocop-hq/rubocop
g fetch upstream-performance
g fetch upstream-core

g remote add upstream-core は RuboCop Core からインポートするためのもの。 すでにコミットしてある RuboCop Performance からも cherry-pick を行うため g remote add upstream-performance としている。

それぞれの remote リポジトリから必要なコミットを持ってくる。

以下のように素直に持ってこれるコミットは問題がない。

% g cherry-pick 7cbfa5a63a2ec337a1d36cf0bbd20d8196cbf0bf
[wip_revise 845e7bf4d] Add MIT license
 Author: Daniel Colson <danieljamescolson@gmail.com>
 Date: Fri Jun 29 15:58:14 2018 -0400
 1 file changed, 20 insertions(+)
 create mode 100644 LICENSE.txt
% g cherry-pick c551accab8ce0710c6248163d7aeccb1819751ba
[wip_revise a8c12a5da] Create gemspec for initial version
 Author: Daniel Colson <danieljamescolson@gmail.com>
 Date: Fri Jun 29 17:05:03 2018 -0400
 3 files changed, 44 insertions(+)
 create mode 100644 lib/rubocop-performance.rb
 create mode 100644 lib/rubocop_performance/version.rb
 create mode 100644 rubocop-performance.gemspec

コンフリクトした場合は都度解決。

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   spec/spec_helper.rb

明白にローカルを優先する場合は git checkout --ours が手早い。

% g co --ours spec/spec_helper.rb

以下のように cherry-pick した際に、Untracked files として不要なファイルが入った場合。

Untracked files:
  (use "git add <file>..." to include in what will be committed)

(snip)

以下でまるっと消したりしていた。

% g st -s | grep '^DU ' | cut -d ' ' -f 2 | xargs git rm

全体としてもっとクールな手順はあるかもしれないが、一手法の端書まで。