1. ホーム
  2. git

[解決済み] 多くのサブディレクトリを新しい別の Git リポジトリに切り離す

2022-04-27 03:09:15

質問

この質問は サブディレクトリを別の Git リポジトリに切り離す

1つのサブディレクトリをデタッチするのではなく、2つ以上のサブディレクトリをデタッチしたいと思います。例えば、私の現在のディレクトリツリーは以下のようなものです。

/apps
  /AAA
  /BBB
  /CCC
/libs
  /XXX
  /YYY
  /ZZZ

そして、代わりにこうしてほしい。

/apps
  /AAA
/libs
  /XXX

--subdirectory-filter の引数は git filter-branch は、初回実行時に指定されたディレクトリ以外を削除してしまうので、うまくいきません。私は --index-filter の引数を不要なファイルすべてに指定すれば(面倒ではありますが)うまくいくのですが、複数回実行してみると、次のようなメッセージが表示されます。

Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f

何かアイデアはありますか?TIA

解決方法は?

試行錯誤の結果、自分自身の質問に答えています。

の組み合わせで何とかなりました。 git subtree git-stitch-repo . これらの指示は基づいています。

まず、残しておきたいディレクトリをそれぞれ別のリポジトリに抜き出しました。

cd origRepo
git subtree split -P apps/AAA -b aaa
git subtree split -P libs/XXX -b xxx

cd ..
mkdir aaaRepo
cd aaaRepo
git init
git fetch ../origRepo aaa
git checkout -b master FETCH_HEAD

cd ..
mkdir xxxRepo
cd xxxRepo
git init
git fetch ../origRepo xxx
git checkout -b master FETCH_HEAD

そして、新しい空のリポジトリを作成し、そこに最後の2つをインポート/ステッチしました。

cd ..
mkdir newRepo
cd newRepo
git init
git-stitch-repo ../aaaRepo:apps/AAA ../xxxRepo:libs/XXX | git fast-import

これで2つのブランチが作成されます。 master-Amaster-B で、それぞれ縫合されたレポのうちの1つの内容を保持しています。それらを結合してクリーンアップするために

git checkout master-A
git pull . master-B
git checkout master
git branch -d master-A 
git branch -d master-B

さて、この現象がいつどのように起こるのかよくわからないのですが、最初の checkoutpull を実行すると、そのコードは魔法のように master ブランチにマージされます (ここで何が起こっているのか、何かヒントがあれば幸いです!)。

すべてが予想通りに動いているように見えますが、もし私が newRepo コミット履歴を見ると、チェンジセットが両方の apps/AAAlibs/XXX . 重複を削除する方法があれば、完璧なのですが。