現在、トップレベルのサブフォルダーに複数のプロジェクトが含まれている大きなリポジトリがあります。たとえば、/a
、/b
、/c
、/d
などです。
次に、そのリポジトリを2つの異なるリポジトリに分割します。1つは/a
と/b
を含み、もう1つは/c
と/d
を含みます。
単一のディレクトリを抽出するのに最適なgit filter-branch --subdirectory-filter
を知っていますが、一度に複数のディレクトリを抽出することはできないようです。
git filter-branch --Prune-empty --tree-filter
も知っています。これにより、すべてを削除できますが、2つのディレクトリが必要でした。存在する可能性のあるすべてのトップレベルディレクトリを手動で指定する必要があるため、これは完全には正しくないと感じます。
大きなリポジトリから2つのディレクトリを抽出するためのより良い方法はありますか?
PS:もちろん、git filter-branch
以外のものを使用した良い解決策は問題ありません。 ;)
使用する
git filter-branch -f --Prune-empty --tree-filter 'bash preserve-only.sh a b' -- --all
ここで、preserve-only.sh
は次のとおりです。
IFS=':'
GLOBIGNORE="$*"
rm -rf *
これにより、すべてのブランチのすべてのコミットからa
とb
以外のすべてが削除されます。これは、指定されたディレクトリを正確に抽出することと同じです。
実際の分割を完了するには、rm -rf a b
のようなフィルターを使用して、最初の実行で抽出されなかったすべての変更を取得できます。
更新:--index-filter
を使用して処理を高速化しようとしているときに、さらに簡単な解決策が見つかりました。
git filter-branch -f --Prune-empty --index-filter \
'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- a b' -- --all
これはすべてを削除し、その後、指定されたディレクトリを復元します。
このためにtree-filter
よりも良い方法を私は知りません。したがって、必要なすべての情報がすでにあります。今それをするだけです!
2つのブランチを作成することから始めます。
git branch br1
git branch br2
次に、ブランチごとにチェックアウトしてから、tree-filter
を使用してフィルタリングします。
次に、それらをプッシュアウトするか、クローンまたはプルインすることにより、それらを別々のディレクトリに分割できます。
私はこれが好きです
git filter-branch -f --Prune-empty --tree-filter "ls -I a -I b | xargs rm -rf" -- --all