すでに解決策があるかもしれませんが、他の質問/回答はわずかに異なる問題に対処しているようです (または、私はそれらを本当に理解していません)。
私の意図は、Git リポジトリのサブディレクトリを切り離して独立したリポジトリにすることですが、履歴はそのままに、サブディレクトリの履歴のみを保持することです。 この質問は最初はうまくいくように見えましたが、その後、次のような欠陥があることに気付きました。
git filter-branch --subdirectory-filter
指定されたサブディレクトリに関連するコミットのみを保持します。ただし、これは、現在そのサブディレクトリにあるが、他の場所からそこに移動されたファイルに影響を与えるコミットが削除されることを意味します。
「クリーンアップされた」リポジトリの最初のコミットが「すべてをサブディレクトリ X に移動する」であったため、これに気付きました。これは、ファイルが以前に別の場所にあったことを意味しますが、その時点からのコミットは保持されませんでした。
したがって、必要なのは次のようなコマンド (または一連のコマンド) です。
- リポジトリ内のすべてのコミットを削除します
- 以下のファイルを含むコミットを除く
- 現在、指定されたサブディレクトリにある、または
- 他の場所にあるこれらのファイルの以前のバージョンです。
B)
これらのコミットの一部には、これらの条件に一致しないファイルも含まれている可能性があります。これらのファイルをリポジトリから完全に削除できれば、素晴らしいアドオンになります。
編集:
上記のリンクされたソリューションは、新しいリポジトリのサブディレクトリ コンテンツをリポジトリのルート ディレクトリにプルします。@Amberが指摘したように、これはすでにルートディレクトリにあるファイルで問題を引き起こす可能性があります。だから私が達成したいのは:
元のディレクトリ構造:
\Old-Repo
\.git
\ABC
|- dir content
\DEF
|- dir content
\GHI
|- dir content
デタッチされたリポジトリのディレクトリ構造は次のようになります。
\New-Repo-DEF
\.git
\DEF
|- dir content
ではない:
\New-Repo-DEF
\.git
content of old DEF subdirectory
その後、通常のコミットでコンテンツを DEF サブディレクトリからルート ディレクトリに移動します。