$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

あるレポジトリのサブディレクトリ配下を別のレポジトリへ履歴付きで移行する

Gitで開発していて、あるサブディレクトリ以下を別のレポジトリに移行したいと思うことがある。今回はそういうことをしてみたのでメモ。

まずGitHubにそのようなやり方の指南がある(Splitting a subfolder out into a new repository - GitHub Docs)。大体これで良いのだけれど、このやり方だとサブディレクトリのpathがそのままになってしまうという問題がある。大抵のケースで、あるサブディレクトリを別のレポジトリに分割したいとなった時、そのサブディレクトリがレポジトリルートに来てほしい。

そういう場合はGit Filter Repo — Splitting a Subfolder Into A New Repository | by Edward Ezekiel | Mediumにも紹介されているようにgit filter-repo --subdirectory-filter を使えばいい。これを使えば自動的にサブディレクトリがレポジトリルートになるように移行してくれる。

今回自分はhttps://github.com/shibayu36/go-playground/tree/main/diaryhttps://github.com/shibayu36/go-diary-apiへ移行したかった。その時に使ったコマンドはこちら。

brew install git-filter-repo
cd ~/Downloads
git clone git@github.com:shibayu36/go-playground.git # freshなrepositoryを用いないと危険(filter-repoが警告を出してくれる)
cd go-playground/
git filter-repo --subdirectory-filter diary/
git remote add origin git@github.com:shibayu36/go-diary-api.git
git remote -v # 確認
git push -u origin main

結構簡単に移行できて便利ですね。