6

私はついにCVSリポジトリをgitに移行しました。残念ながら、CVSではブランチを使用しませんでしたが、異なるバージョン/ブランチは異なるサブディレクトリに分けられました。

IEには、次のディレクトリ構造があります。

/root
    /lib
    /tools
    /src
        /v1.0
        /v2.0
        /v3.5

各バージョンのディレクトリを保持する代わりに、srcサブディレクトリ内の3つのバージョンを別々のブランチに分割する方法はありますか?

git-subtreeの使用が提案されているStackOverflowQuestion 4877053で同じ質問を見つけましたが、git-subtreeのマニュアルを読んだ後でも、問題を解決するためにそれを使用する方法がわかりませんでした。

誰かが私にもっと詳細な説明や別の解決策を教えてもらえますか?

私はgitにまったく慣れていないので、おそらくそれがサブツリーのマニュアルを理解していなかった理由です;-)

すべての回答に感謝します!

4

1 に答える 1

3

後でリポジトリに何を残したいかによって異なります。

v1.0、 、の3 つのブランチが必要な場合v2.0v3.5、すべて次のような構造になります。

/root
    /lib
    /tools
    /src

はい、私はあなたがそれを行うことができると確信しています。ブランチ構造に関しては、次のような結果になります。

-- A -- B -- Current 
              | 
              |--- v1.0
              |--- v2.0
              |--- v3.5

A, B,Currentは git に移行してからコミットしたコミットであり、ここでv1.0,v2.0v3.5は本質的に「行き止まり」のブランチです。次のようなブランチ構造を取得したい場合は、いくつかの凝ったことを行うことができます。

-- v1.0 --- v2.0 --- v3.5 -- A -- B -- Current

つまりv1.0、 、v2.0、およびv3.5を独自のブランチに分離し、現在のバージョンの最初のコミットに 、 、およびにリベースv1.0します。v2.0v2.0v3.5v3.5

しかし、あなたが何をしたいのか正確にはわかりません。


各バージョンのディレクトリを保持する代わりに、src サブディレクトリ内の 3 つのバージョンを別々のブランチに分ける方法はありますか?

はい、私はあなたがこれを行うことができると確信しています。私の方法論は少し...複雑です、認めますが、ここに行きます。注意てマニュアルページを読んでください。次のコマンドはおそらくすべてを台無しにするわけではありませんが、自己責任で使用してください。

  1. git checkout -b v1.0- 新しいブランチに入る。
  2. 以外のすべてを削除しますv1.0。これを行うにはいくつかの方法があります。この質問には、 ; を除くすべてを削除する方法がいくつかあります。私はそれらを私のために働かせることができませんでした、それはあなたにとってよりうまくいくかもしれません.

    `git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch src/v2.0" --prune-empty -f`
    

    src/v2.0 これにより、関連するすべての履歴がブランチから削除されます。-fこのフィルターには必要ありません。しかしgit-filter-branch、ある種のバックアップを行い (man ページを読んでください)、エラーを吐き出す可能性があります。2回目に挑戦するのは挑戦的ですgit filter-branch

    これを繰り返して、同様に削除src/v3.5します。

    これにより、 が残りますsrc/v1.0src/v1.0ソースを からにシフトしたい場合がありsrcます。git filter-branch --subdirectory-filter(man ページを読む) を実行してディレクトリ構造を取得し(/v1.0-filesサブディレクトリ のファイルのみが含まれていますv1.0。コンテンツを からv1.0に移動しましたroot)、man git-filter-branchページ内の例 (具体的には一番下の例) を見て、ファイルを移動します。サブディレクトリに。それはやり過ぎかもしれません。そして、それを、選別された他のすべてのものを含むブランチにマージするgit filter-branch --subdirectory必要があります。単純なmv v1.0/* .方法でうまくいくかもしれませんが、履歴に別のコミットができてしまいます。私はあなたが何を好むかわかりません。

    これv1.0で、独自のブランチを作成できました。わーい!

  3. v2.0とについて繰り返しv3.5ます。

残念ながら、これがあなたに何かを与えているのを見ることはできません...「奇妙な」歴史ですが。おそらくv2.0、本質的にv1.0+ 改善があります。私が上にリストした構造 (3 つの「行き止まり」の分岐) は、以前のバージョンを示してv2.0おりv3.5、構築していません。これが問題であるかどうかなど、あなたがどのような歴史を持っているかは完全にはわかりません.

v1.0v2.0およびv3.5独自の小さなブランチを持っているため、見栄えの良い履歴が必要な場合は、git mergeそれらなどを実行できます。git rebase

うまくいけば、これで少し考えることができます。私が言ったように、マニュアルページを読んでください。:)

于 2012-03-02T16:25:33.623 に答える