web-dev-qa-db-ja.com

プロジェクトの複数のバージョンを管理する方法は?

リビジョン管理のためにgitを使用してオープンソース化されているプロジェクトがあります。まもなく、プロジェクトのプレミアムホストバージョンもリリースする予定ですが、オープンホストバージョンには存在しないはずのプレミアムホストバージョン専用のコード(パフォーマンスなど)に変更が加えられる予定です。

オープンソースバージョンのバグを修正した場合、そのバグはプレミアムホストバージョンでも発生する可能性が高いため、2つの別個のディレクトリ/プロジェクトを作成しないようにします。 2つの場所で変更を加えたくありません。

これを管理する最良の方法は何ですか?一部のファイルには2つのバージョン(オープンソースバージョンとプレミアムホストバージョン)が必要なため、gitで単純に分岐することは正しく機能しません。

32
Justin

それでも、ブランチは機能し、2つの異なるバージョンを維持できるようになります。

プレミアムバージョンに適用されるバグがある場合は、masterで修正し、premiumブランチでマージします。
Gitはmasterpremiumの間で分岐してから変更されたもの、つまりバグ修正のみをマージします。
masterpremiumの両方で修正プログラムを公開する別の方法は、共通の祖先から行うことです。「 Gitマージ修正プログラムを参照複数のブランチ 」。


2015年更新:git 2.5(2015年7月)は、以下に示すgit-new-workdirを新しいコマンド git worktree add <path> [<branch>] に置き換えました。

詳細については、「 Gitを使用した複数の作業ディレクトリ? 」を参照してください。


元の回答2012:

me-andコメントで言及されています コマンドgit -new-workdir
見る:

これに対する1つの解決策は、リポジトリの別のローカルクローンを作成することです。ローカルでクローンを作成すると、Gitは自動的にハードリンクを使用するため、クローン作成は非常に高速です。
しかし、これには1つの問題があります。これで、最新に保つ必要のある別の別のリポジトリができました。

これがgit-new-workdirの出番です。
リポジトリの本格的なクローンを作成する代わりに、新しい作業ディレクトリ(独自のインデックスを持つ)をセットアップします。
実際のリポジトリ自体は、元の作業ディレクトリと新しい作業ディレクトリの間で共有されます。これの意味は:

  • 1つのリポジトリを更新すると、新しいコミットは他のすべての作業ディレクトリにも即座に表示されます。
  • 作業ディレクトリの1つに新しいコミットまたはブランチを作成します。これらはすべての作業ディレクトリですぐに使用できます。

注:コミットは自動的にそこにありますが、同じブランチをチェックアウトしている場合、Gitは作業コピーを更新しません。あなた自身でそれをしなければならないでしょう。

28
VonC

この目的には、worktreeの使用が最適です。

私の場合、同じソフトウェアの2つのバージョンがあり、基本は同じですが、各バージョンにはいくつかの異なる機能があります。

したがって、2つのworktreeを作成します。つまり、マスターの横に2つの関連する長期実行ブランチを作成します。

$git worktree add -b version-silver ..\version-silver master
$git worktree add -b version-gold ..\version-gold master

で、〜がある:

$git branch
master  # base stuff here
version-silver # some normal features
version-gold # some better features

リポジトリは1つですが、上記のブランチごとに3つの別々のフォルダーが並んでいます。そしてマスターに共通の変更を加えます。次に、他の両方のバージョンとマージします。

cd master
vim basic.cpp
git add .
git commit -m "my common edit on basic.cpp"
cd ..\version-silver
vim silver.cpp
git add .
git commit -m "my specific edit on silver.cpp"
git merge master # here i get the basic.cpp latest changes for silver project
cd ..\version-gold
git merge master # here i get the basic.cpp latest changes for gold project

各バージョンの特定の変更も対応するフォルダーに入れられ、各プロジェクトの作業は分離され、IDEと混同しないでください。

お役に立てば幸いです。

5
vaheeds