ほわいとぼーど

ぷろぐらまのメモ帳

既存のGitレポジトリから新しいレポジトリへ複数の要素を分割する (不完全)

既にあるレポジトリの一部をコミット履歴ごと別のレポジトリに移したいという例のアレです。

(repo_A)
 ├aaa/
 ├bbb/
 ├ccc
 └ddd

という構成の既存レポジトリがあって、これを元に次の新しいレポジトリ

(repo_B)
 ├aaa/
 └ccc

としたい。

まず複製する

mkdir repo_B
git clone repo_A repo_B

そして残したい物を列挙して次を実施

cd repo_B
git filter-branch -f --prune-empty --index-filter 'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- aaa ccc' -- --all

これで指定以外のファイルのコミットログが削除される。

後はリモートレポジトリ設定を書き換えてpushすればよい

git remote set-url origin git@github.com/ki38sato/repo_B.git
git push -u origin master

というのを試してみたのだが、移動しなかったファイルのコミットも新しい方に残るんだなコレ。不完全だったか。
(マージプルリクだから?)
ただ正直よくわからずコピペで試した段階なのでまだよくコマンド理解してない。
初めはsubdirectory-filterとか調べてるうちは理解できていたのだが、
複数要素選択どうするんだろうってなって
StackOverflow見て試したのがイマココ
普段sourcetree使ってる情弱だが後で気が向いたら調べたい (汗