:
- は元
main
- はそれを
main
にexternal
で起こったすべてのコミットを持参隔離
最初に、オリジナルを隔離するmain
:
おそらくmain
が独自のリポジトリにあるようです。
オリジナルのmain
がサブディレクトリexternal/main
を作成したコミットの親として設定されている場合は、external
リポジトリから取得できます。そのような例は、Git Book Subtree Merging pageに記載されているプロセスです。
導入されたサブツリーは、in this answerのように見つけられます。
そしてそれはちょうどmain
の基底であるコミットの全体のセットをつかんでそれからリポジトリを作ることです。第二のために
、はexternal
で起こったすべてのコミットmain
にそれを持参:あなたはすでにexteral/main
サブフォルダに変更を含むコミットを単離したが、あなたは状態として、それが含まれていません
元のmain
がコミットします。
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter main -- --all
filter-branch
が唯一のサブディレクトリを作成しread-tree
ような、より複雑な操作を処理する方法を知らなくても、特定のサブディレクトリの場所にファイルをチェックするためです。
filter-branch
操作の後に、main/external
で発生したすべての変更を含むコミットセットが残ります。コミットのこのセットはfilteredMain
ブランチで到達できると仮定してください。
コンテンツがサブディレクトリからルートに移動されたので、ファイルの場所は今度はmain
リポジトリの内容と同じになります。これにより、両方のツリーが結合されます。この2つのツリー、main
のマスターブランチとfilterBranch
は共通の履歴がないので、コミットの変更を再生することによってrebase
に参加できます。この後filteredMain
分岐がmain
リポジトリ内の元master
枝の上に再生external/main
に起こったすべての変更が含まれている必要があり
# in the main repository
# bring the external repository and get the branch
git remote add external /path/to/external
git fetch external filteredMain
git checkout filteredMain
# We need the first commit of this tree for the rebase command
firstCommit=$(git rev-list --max-parents=0 HEAD)
# run the rebase
git rebase --onto master $firstCommit filteredMain
。
'ZZZ'はどのように' AAA'にマージされましたか? – LopSae
少しの意味を伝え、リポジトリの 'main'や' external'といった質問の読みやすさを助ける名前を使うこともできます。 – LopSae
通常のメカニズムでは、 'external'でリポジトリを取得し、' read-tree'を使って 'external'リポジトリのディレクトリに置きます。 – bwoebi