filter-branch を使用すると履歴を維持したまま、特定のフォルダ内のみを含むリポジトリを作成できます。
特定のフォルダを新しいリポジトリに分割する手順
-
対象のリポジトリをクローンします。
git clone "リポジトリのアドレス"
-
カレントフォルダ(ディレクトリ)をクローンしたリポジトリに移動します。
cd "cloneしたリポジトリのパス"
-
対象フォルダのあるブランチをチェックアウトします。
git checkout -b "ローカルブランチ名" "origin/リモートのブランチ名"
-
対象フォルダ以外のファイルと履歴を削除します。
git filter-branch --prune-empty --subdirectory-filter "./フォルダのパス" "対象のブランチ名"
- 指定したフォルダ以外のファイルと履歴が削除されます。
- 指定したフォルダの中身がリポジトリのルートへ移動されます。
- ここで指定するフォルダのパスは、リポジトリのルートからの相対パスです。
-
重要 リモートリポジトリを変更します。
変更する場合
git remote set-url origin "新しいリモートリポジトリのアドレス"
削除する場合
git remote rm origin
重要
次のコマンドでリモートリポジトリのアドレスが確認できます。必ず変更されていることを確認してください。変更されていない状態でプッシュをするとオリジナルのリポジトリ内容が失われてしまいます。
git remote -v
-
新しいリモートリポジトリにプッシュします。
git push -u origin "ブランチ名"
- 失敗した場合は 手順 1. でクローンしたブランチを削除し、手順 1. からやり直します。
- 手順 5. に失敗した状態で手順 6. を実行するとオリジナルのリポジトリ内容が変更されます。手順 5. は慎重に行ってください。
実行例
-
git filter-branch 実行前の状態
【clone】 $git clone /d/git-test/_sh/orgRepos /d/git-test/_sh/newRepos Cloning into 'D:/git-test/_sh/newRepos'... done. 【filter-branch 実行前のファイル】 newRepos/.git newRepos/root1.txt newRepos/root2.txt newRepos/subdir1/subdir1.txt newRepos/subdir1/subdir2.txt
-
git filter-branch の実行後
ディレクトリ subdir1 を対象に filter-branch を実行しています。 subdir1 の中身がルートに移動し、他のファイルは削除されています。【filter-branch】 $git filter-branch --prune-empty --subdirectory-filter ./subdir1 main WARNING: git-filter-branch has a glut of gotchas generating mangled history rewrites. Hit Ctrl-C before proceeding to abort, then use an alternative filtering tool such as 'git filter-repo' (https://github.com/newren/git-filter-repo/) instead. See the filter-branch manual page for more details; to squelch this warning, set FILTER_BRANCH_SQUELCH_WARNING=1. Proceeding with filter-branch... Rewrite 95d06751fd6ad571a8048cea9a3c41b04ad2b2c5 (1/1) (0 seconds passed, remain ing 0 predicted) Ref 'refs/heads/main' was rewritten 【filter-branch 実行後のファイル】 newRepos/.git newRepos/subdir1.txt newRepos/subdir2.txt
検証環境
- git version 2.30.0.windows.2
- Microsoft Windows 10 Pro Version 20H2 OS Build 19042.789 Experience: Windows Feature Experience Pack 120.2212.551.0