2012-02-16 17 views
3

私たちは非常に大きな古代のフラットCVSレポを以下のような形式で持っています。私は完全な歴史を持つ独自のgitリポジトリとして各サブディレクトリをインポートしました。'CVS時代'のレポをサブモジュール付きのgit repoに変換する

. 
├── liba 
├── libb 
├── libc 
├── prog1 
├── prog2 
└── prog3 

3つのプログラムは、次のようにライブラリを使用することとしましょう:CVSはツリーの一部をタグ付けできるので

. 
├── prog1 
│   ├── liba 
│   └── libb 
├── prog2 
│   ├── libb 
│   └── libc 
└── prog3 
    ├── liba 
    └── libc 

- 私たちは、バージョンタグを持つ各ライブラリやプログラムのリリースにタグを付けます。例えばliba_4x23,prog3_2x22。私たちは、ライブラリタグなしでプログラムの新しいバージョンをリリースした場合

我々はまた、リリース時に使用するライブラリのすべてのバージョン(すなわちliba_3x19libc_7x88

でプログラムをタグ - タグは、プログラムの最も古いバージョンのままそれは使用された。
gitインポートの仕組みのために、実際にはプログラムの最新バージョンで終了します(それについて心配することはありません)。

Gitサブモジュールはこれに非常に良い解決策であるようですプログラムをチェックアウトして、適切なバージョンのライブラリをすべてサブモジュールとして取得します。

現在、すべての現在のプログラムはライブラリのリリースが異なるため、特定のバージョンでサブモジュールを改造する必要があります。

  • prog1libb_4x50
  • prog2とリンクされているlibb_4x70が最新バージョンであると仮定すると、libb_4x70

とリンクされ、その後prog2の例は、タグ付けされたlibbを追加するそれでは、どのように簡単

git checkout prog2 
cd prog2 
git submodule add libb 
.... done 

ですバージョン付きched)4x50prog1?あなたは私たちもやりたいことが何

:-)より良いアイデアを持っている場合感謝

その他のアドバイスは、バックプログラムの3バージョンを移動して、各バージョンの適切なサブモジュールを設定しています。下位互換性のために、またどのように動作するかについて管理者の一例として。

答えて

4

サブモジュールの考え方(explained here)は、親リポジトリ内に特定のコミットを記録することです。

だから、あなたがする必要があるすべては右のタグをチェックアウトし、その後、親レポ内その新しい状態を記録するために、libbを追加した後、次のとおりです。

git checkout prog1 
cd prog1 
git submodule add libb 
cd lib 
git checkout libb_4x50 # make sure to make a branch 
         # if you want to do any modification 
         # based on libb_4x50, 
cd .. 
git add -A . 
git commit -m "fix correct libb version" 

(「デタッチHEAD」のコメントについては、 「git submodule update * deletes uncommitted files」を参照)

+0

ありがとうございました。 "サブモジュールの考え方は、親レポ内に特定のコミットを記録することです。"これはまさに私が望む結果です。それは私が思ったよりも簡単だった。 –

関連する問題