10

ソース管理で問題が発生することはほとんどありません。この例では、Perforce で問題が発生していましたが、多くの SCM、特に分散 SCM で同じ問題が発生すると思われます。

Perforce は、変更リスト (または必要に応じて変更セット) をサポートしています。変更リストは、次の 2 つの一般的な使用方法をサポートしています。

  1. 変更リストをコミットする場合、コミットはアトミックであるため、すべてのファイルがコミットされるか、まったくコミットされません。これは、チェンジリストを参照するときにほとんどの人が話題にする主要な機能です。

  2. Perforce は複数のチェンジリストをサポートしています。基本的に、ファイルをチェックアウトするときは、ファイルが属するチェンジリストを指定します。そのため、数か月の作業が必要で数百万ドルを稼ぐ新しい電子メール機能に取り組んでいて、テクニカル サポートの誰かが昨日修正しなければならないバグを持ってきたとしても、最初から始める必要はありません。プロジェクト全体の新しいブランチ。バグのあるファイルを新しい変更リストにチェックアウトし、問題を修正し、新しい変更リストをチェックインして、何も起こらなかったかのように、新しいメール機能の実際の作業に戻ることができます。

ほとんどの場合、すべてがうまく機能します。ただし、電子メール機能を実装するときは、特に main.h に無数の変更を加える必要があり、バグ修正に取り掛かると、小さな変更を加える必要があることに気付くことがあります。 main.h にもあります。新機能のチェンジリストにはすでに main.h がチェックアウトされているため、バグ修正用のチェンジリストに簡単に入れることはできません。

今、あなたは何をしますか?いくつかの選択肢があります:

  1. 新しい clientspec を作成します。Perforce の clientspec は、デポ内のファイル/ディレクトリのリストと、すべてがコピーされるローカルの宛先です。そのため、電子メール機能を変更することなく、プロジェクトの 2 つ目のコピーを作成できます。

  2. ファッジをします。変更した main.h のコピーをバックアップし、このファイルを元に戻します。その後、main.h をバグ修正チェンジリストに自由にチェックアウトできます。バグを修正し、バグ修正の変更リストにチェックインしてから、main.h をメール機能の変更リストにチェックアウトします。最後に、最初に作成したバックアップからすべての変更をマージします。

  3. main.h に加えたすべての変更に副作用や依存関係がないことを確認したので、main.h をバグ修正変更リストに移動し、変更を加えてチェックインします。その後、メール機能に再度チェックアウトします。変更リスト。明らかに、このアプローチには 2 つの問題があります。1 つ目は、考慮していなかった副作用が実際に存在する可能性があることと、2 つ目は、バージョン履歴が壊れていることです。

オプション 1 はおそらく最もクリーンですが、必ずしも実用的ではありません。私が取り組んでいたプロジェクトには、数百万行のコードと非常に複雑なビルド プロセスがありました。新しい環境をセットアップするには 1 日かかるため、5 分間のバグ修正は現実的ではありませんでした。

オプション 3 は悪いオプションですが、これが最も高速であるため、非常に魅力的です。

これで、私が通常使用するオプション 2 が残ります。

誰かがより良い解決策を持っていますか?

長い質問で申し訳ありませんが、StackOverflow で、十分に考え抜かれた質問がより良い答えを引き出すことを発見しました。

4

8 に答える 8

7

この正確な問題は、「もつれた作業コピーの問題」と呼ばれています。Ryan Tomayko はThe Thing About Gitというタイトルのブログ エントリを持っており、この問題の詳細と Git による対処方法について説明しています。

これは、Git の優れた点の 1 つです。私git add -pは少なくとも毎日使用して、互いに独立して意味のあるコードの個々のチャンクをコミットできるようにしています。論理的に異なる 2 つの変更が同じソース ファイルにあるという事実は、重要ではなくなりました。

于 2009-01-16T06:14:59.717 に答える
3

最初から複数のワークスペースを維持することで、これを Perforce で管理しています。私の主な開発はメインライン (新しい開発が行われる場所) で行われ、別の開発はリリースされたコードのブランチを指しています。バグを修正する必要がある場合は、リリース ブランチに移動します。

これがうまくいくかどうかはわかりませんが、少なくともバグを修正するたびに新しいワークスペースを作成する必要はありません (既に存在するため)。

于 2009-01-19T20:20:13.197 に答える
2

単一の「タスク」がコミットされた複数の変更セットにまたがることができるように、ジョブを使用します。

したがって:

  1. main.h の変更が他の変更から独立していることを確認する
  2. main.h の現在の状態をチェックイン - 長期の電子メール ジョブ中
  3. main.h のバグ修正を行う
  4. バグ修正変更セットのチェックイン
  5. 必要に応じて、電子メール ジョブの下の main.h を編集します。
于 2009-01-16T12:11:14.127 に答える
2

ClearCase は、チェンジリスト (UCM フレーバーでは「アクティビティ」と呼ばれる) もサポートしており、同様の課題を提示します。

オプション 1 (「ブランチの種類」) は、「デバッグ作業」が現在の開発作業 (電子メール機能) と互換性がなく、別のブランチに保持するのが最適であると判断した場合にのみ意味があります。次に、「パッチ」ブランチで行われた修正をメイン ブランチにレトロフィットできます (修正するすべてのバグが両方に存在する必要があるわけではないため、現在の開発では一部の修正が廃止されている可能性があります)。「ブランチとは」、およびマージ ワークフロー
とは も参照してください。

オプション 3 は、変更セットの概念の制限を示しています。ファイルの単一のリビジョン (または「バージョン」) は、一度に1 つの変更セットの一部にしかなれません。

Greg が言及した(パッチのgit add -p追加)は、オプション 1 と 3 の代替です。これは、実際にコミットするものと残すものを決定するゾーンである「インデックス」(ステージング エリア) のステージング機能を利用するためです。あなたのプライベート空間に。 それは素晴らしいことですが、私の経験では、特に 2 つの異なる進化を適用する共通のファイル セットでは、長期間にわたって維持することは非常に困難です。ブランチはよりクリーンで、単体テストがより簡単です。ただし、あなたが言及したような小さな修正の場合、それは良い方法かもしれません.

オプション 2 は、2 つの異なる取り組みに対して 2 つの変更があることに気付いた場合の実用的な解決策です (それらはまだ互換性があり、互いに「壊れる」ことはありません)。
しかし、さらに簡単な解決策は、次のことだけです。

  • メールで main.h の現在の状態をチェックインし、
  • バグのチェックアウト、修正、バグのチェックイン
  • 次に、電子メールでチェックアウトして、電子メール機能の開発を再開します。

繰り返しになりますが、2 つの開発作業 (電子メールとバグ) に互換性がある場合は、アクティビティが混在する改訂履歴を作成できます。

于 2009-01-16T06:54:18.530 に答える
2

ブランチを作成するオプション 4 については言及していません。

他のブランチからの統合だけで、個々の変更が行われないメイン コード ラインを持つことができます。

次に、派手な新しい電子メール機能を作成するメインの開発ラインがあります。これは、ほとんどの作業を行っている場所です。

最後に、バグ修正ブランチがあります。これは、すべてのマイナーな編集と緊急のバグ修正を行う場所です。これらがテストされると、QA およびリリース用のメイン コード ラインに統合されます (別のブランチにある必要があります)。これらの編集は、メイン ラインから開発ラインに統合できるため、常に最新のコードで作業できます。この統合は、選択した時点で行うことができるため、新しいコードで問題が発生しないことを確信できます。

これが(IMO)最善の解決策です。

于 2009-03-10T22:48:02.863 に答える
1

Perforce の場合、p4 tar のようなツールを使用できます。

http://public.perforce.com/wiki/P4tar

現在の変更リストを保存して元に戻し、修正を行ってから、作業を復元できます。変更を main.h に統合する必要がありますが、これにより作業がはるかに簡単になります。

于 2009-01-19T20:10:40.797 に答える
1

Perforceの「もつれたワーキングコピー」問題の解決策は棚上げされていると思います

次のようにコマンドラインで使用できます。

p4 シェルブ -c 123

私は通常、IDE プラグイン (Visual Studio または Eclipse) または P4V 内で使用します。保留中は、ファイルを元に戻すかどうかを選択できます。基本的に、緊急作業のために白紙の状態になります。そして、中断された作業に戻るために作業が完了したら、ファイルの保留を解除できます。

コマンドラインを使用している場合は、選択した変更リストの変更をシェルフし、成功した場合は元に戻す簡単なスクリプトを自分で作成して、白紙の状態にすることができます。

p4 shelve -c $1 && p4 revert -c $1 //depot/your/branch/...

パラメータとして変更リスト番号を指定して呼び出すだけです。逆に、他の作業が完了したら、次のようにシェルフからファイルを取得してシェルフを削除できます。これにより、基本的に開始点に移動します。

p4 unshelve -c $1 -f -s $1 && p4 shelve -c $1 -d

于 2016-07-27T17:54:27.723 に答える
1

私はChrisFに同意します。分岐は、これに対する最も自然な解決策です。

私はしばらく Perforce を使用してきました。確かに、他の SCM ほど分岐が強力ではありませんが、それは可能です。

トリックは非常に簡単です: 作業中のタスクごとにブランチを作成し (タスク パターンごとの非常に古いブランチ)、それに切り替えます。他に修正が必要な場合はどうすればよいですか?簡単です。すべてをチェックインした後で別のブランチに切り替えるだけです (チェックインする必要のない scm もあります) 修正して、後で元の「メール」ブランチに戻ってください。

于 2009-04-28T09:05:05.617 に答える