6

すでに解決策があるかもしれませんが、他の質問/回答はわずかに異なる問題に対処しているようです (または、私はそれらを本当に理解していません)。

私の意図は、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 サブディレクトリからルート ディレクトリに移動します。

4

1 に答える 1

1

履歴の複雑さによっては、 でサブディレクトリを抽出する前に、履歴を書き換えてファイルを移動することが実行可能である場合がありますgit filter-branch --tree-filter(ここで--subdirectory-filter説明) 。

つまり、ディレクトリgit log -- somedirの最も古いコミットとして「ファイル XYZ を somedir に移動する」と表示されている場合は、 . このようにして、サブリポジトリを抽出する前にディレクトリ構造をまっすぐにすることができます。somedirgit filter-branch --tree-filter 'insert a fairly foolproof script here that moves files XYZ to somedir' HEAD

私は数日前にかなり小さなリポジトリ(〜150コミット、線形履歴)でこれを行いましたが、うまくいきましたが、深刻な自動化なしでは拡張できないと思います.

于 2013-05-03T13:08:14.223 に答える