なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

Git でとあるディレクトリ以下の履歴を引き継いだ状態で新しいリポジトリに切り出したい

例えば、何らかの理由でリポジトリのこのディレクトリ以下の部分だけ別リポジトリで管理したいな~!って場合のやり方。
履歴を引き継がなくてもいい場合はそのまま新しいリポジトリがある場所にコピーすれば良いんだけど、履歴も引き継ぎたい場合。

やり方は簡単で、特定のコマンドを 2 ~ 3 回叩けば終わる。 ということで、まずは、該当リポジトリを新たにクローンし、そこへ移動します。
新しくクローンする理由としては、該当コマンドは現在のリポジトリの履歴を書き換える動作を行うためですね

$ git clone https://github.com/mika-f/example-repository.git
$ cd example-repository

移動後、以下のコマンドをインストールします。
Windows の場合は、次のようにしてインストール出来ます。

$ scoop install git-filter-repo

インストールが完了したら、分けたいサブディレクトリを引数に渡して、コマンドを実行します。

$ git filter-repo --path subdirectory

これで、今操作しているリポジトリには、 subdirectory 以下のファイルと、それに関連した履歴のみが残っています。
ただ、この場合、 subdirectory 以下を新しいリポジトリとして運用したいので、ディレクトリもなかったことにしたいはず。
ということで、次のコマンドを実行しましょう。

$ git filter-branch --subdirectory-filter subdirectory/ -- --all

わたしの場合、ある程度深い場所にあったので、このコマンドを上位ディレクトリから順番に実行することで、最終的に該当ディレクトリがルートへくるように修正した。 最後に、リモートリポジトリを新たに設定して、 push してあげれば、新しいリポジトリへの移行は完了です。お疲れさまでした。

$ git remote set-url origin https://github.com/mika-f/new-repository
# そもそも無いケースは、普通に追加すれば良い
$ git remote add origin https://github.com/mika-f/new-repository

# あとは push するだけ
$ git push origin HEAD