2

複数のユーザーが (アプリケーションの異なるインスタンスを使用して) 同時に編集できる多数のカスタム オブジェクトを管理するアプリケーションを構築しています。これらのオブジェクトには基礎となるシリアル化された表現があり、私の計画は、それらを (アプリケーション UI を介して) 外部のソース管理システムに永続化することです。もちろん、これは、アプリケーションがオブジェクトの現在のバージョンの更新、各オブジェクトのマージ インターフェイスなどをチェックできることを意味します。

私の質問は、サポートするソース管理パラダイムと特定のソリューション、およびその理由です。私がソース管理の世界を (おそらく単純に) 見ている方法は、次の 3 つの一般的なパラダイムです。

  1. 単一リポジトリ、ロックされたアクセス (MS SourceSafe)
  2. 単一リポジトリ、同時アクセス (CVS/SVN)
  3. 分散 (Mercurial、Git)

#1 を使用している人は何年も聞いていないので、このケースは完全に無視するつもりです (他に説得力のある議論が得られない限り)。ただし、#2 と #3 のどちらをサポートするか、具体的にどの実装をサポートするかについて、私は途方に暮れています。使用パラダイムが微妙に異なり、単一の UI で基本的な操作を適切に捉えることができないことを懸念しています。

最後にお伝えしておきたいのは、このアプリケーションは、ソース管理システムが既に使用されている可能性がある商用環境での展開を意図していることです。それが本当に契約を破るものでない限り、複数のソリューションをサポートしたくないので、企業環境で広く採用されることはプラスです.

更新:私は具体的にいくつかの理由を探しています:

  1. 商業的に受け入れられているという理由で、どちらのパラダイムが理にかなっていますか? (これは@Andrew Colsonによって回答されたと思いますが、他の人の経験は異なる場合があります)
  2. 平均的な商用開発ショップが、アプリケーション用に 2 つ目のソース管理システムを維持するよりも、既存のソース管理システムを利用することを好むというのは合理的な仮定でしょうか (私のアプリが通常の開発プロセスとは別の重要なニーズを満たすことを考えると)。
  3. 私のニーズでは、これらのパラダイムの 1 つを歪めることなく、#2 と #3 を単一の一連の操作に合理的に取り込むことはできないと仮定して正しいでしょうか?
  4. 私が使用すべきだと思うパラダイムについて、どの特定の実装をサポートすることが重要だと思いますか?
4

2 に答える 2

2

幅広い商用サポートが必要な場合は、現在、#3 よりも #2 (または潜在的に #1..) を検討しています。

編集: もちろん、「商用」が何を意味するかにもよりますが、大規模な商用組織は、開発者ツールの時代遅れになる傾向があります。私は主にプロジェクト/グループごとの SCM を見てきましたが、技術にあまり詳しくない商業組織は、IT グループが提供する単一の SCM ソリューションを使用するだけかもしれません。

于 2010-06-08T03:56:11.763 に答える
2

#2 および/または #3

#1単一リポジトリ、ロックされたアクセス - 最近はめったに使用されないため、言及する価値はありません。

#2単一リポジトリ、同時アクセス - VCS または CVCS (Centralized Version Control System) と呼ばれるものは、今でも広く使用されています。

#3分散型 - 他のシステムが開発者に課している多くの人為的な障壁が取り除かれるため、次の大きな課題です。

まず、あなたの質問/懸念事項に答えます:

1.商業的に受け入れられるかどうかは、組織とその開発者によって異なります。管理者が使用されているソフトウェアの責任者であり、実際の証拠がほとんどない保守的な決定を強硬に行う傾向がある場合、Microsoft が提供するものは何でもデフォルトにする可能性があります。その場合は、頑張ってください。MS のバージョン管理 (具体的には SourceSafe) について聞いたことがあるのは悪いことばかりで、MS に DVCS オプションがまだあるかどうかはわかりません。

OTOH、開発者チームがツールの選択を担当している場合 (またはマネージャーが心を開いている場合)、おそらく git または mercurial が適しています。git は非常に複雑なため、順応するのが面倒です。mercurial は CVCS から非常に簡単に移行できます。ワークフローの感触を掴むために tortoisehg GUI クライアントをダウンロードしてください。両方とも完全に安定しており、生産の準備が整っています。Mercurial と Subversion は、Sourceforge.net と Google Code で使用されており、どちらも何千ものプロジェクトをホストしています。彼らが持っている可能性のあるバグは、知っているか、すでに解決済みです。

2.「この時代、独自のバージョン管理システムを展開することは、時間とエネルギーのばかばかしい無駄です」と言うとき、私は開発者全体を代弁していると確信しています。

確かに、小型でアプリケーションに適合する特別な目的のバージョン管理システムを作成することはおそらく可能です。ただし、決定する前に、事業にかかるすべての時間と労力を考慮してください。言うまでもなく、バージョン管理システムのコードをバージョン管理下に置く必要があります。言っ途切れる...

3.いいえ、実際には両方を一緒に使用できます。多くの人が CVCS (通常はサブバージョン) を使用して組織全体のレベルでバージョンを一元管理し、DVCS を使用して小規模なグループまたは個別にローカルで開発しています (Microsoft のエンジニアが開発者サブグループで秘密裏に git を使用しているという話さえあります)。DVCS はファイル システムでは隠しフォルダーと無視ファイルにすぎないため、すべての情報を CVCS 無視ファイルに簡単に追加して、情報が中央リポジトリで追跡されないようにすることができます。必要に応じて、両方の利点を活用できます。

DVCS にコミットするときに、DVCS のコミット履歴を CVCS に転送する方法さえあると思います。ただし、理由がなかったので、正確な方法はわかりません。

4.間違いなく#2および/または#3。

すでに CVCS が導入されており、それを使用することが期待されている場合は、両方と言います。

Subversion はおそらくすべてを実行できますが、問題は、CVCS のすべてのバージョン履歴がサーバーに保持されることです。IE、ネットワークに直接アクセスできない場合、コミットまたは更新できません。一部の開発者にとってはこれで問題ありませんが、ほとんどの開発者は移動中であり、作業が必要なときに常にネットワーク接続を見つけることができるとは限りません。これの悪い点は、コミットが引きずり出され、トランク開発ブランチとさらに同期していないソースで作業することになります。Subversion (または一般的には CVCS) は、ブランチの処理が苦手なことで有名です。つまり、2 人の開発者がメインラインの 2 つの異なるブランチでアイデアをテストしていて、それらをマージして戻すことにした場合、事態は悪化します。ブランチでは、DVCS の方がはるかに優れています。

CVCS が導入されていない場合は、DCVCS のみを使用してください。

DCVS は、リポジトリのリモート クローンをデポジット ポイントとして機能させることができるため、すべてを行うことができます。ワークフローの違いは、CVCS にコミットすると、問題がなければリモート リポジトリに直接移動することです。DCVS でコミットすると、変更がない場合はローカル リポジトリにコミットされます。次に、一連の変更をリリースする準備ができたら、コミットをリモートにプッシュ (または Mercurial で同期) します。

DCVS 内のリポジトリはすべて同じであるため、場所に関係なく、他のリポジトリからプッシュ/プルできます。最初は頭を包み込むのは少し難しいですが、いくつかの明確な利点があります. まず、プロジェクトの履歴をどこにでも常に持ち歩いているため、中央サーバーがダウンしても、すべての開発者がそのバックアップ コピーを持ち歩いているので、大したことではありません。第二に、開発者がいつでも無制限にコミットできるようにすることは非常に有益です。開発者がコミットすればするほど、バージョン履歴が詳細になり、コードをロールバックする必要がある場合に問題をより早く見つけることができます。

あなたが説明しているものを実装するには。必要な場所にスターター リポジトリを作成します。必要なのはネットワーク アクセスだけです。

初期ファイルをプロジェクト フォルダーにコピーし、コミットします。

ファイルで作業しているすべての人に、リポジトリの独自のコピーを複製してもらいます。

プログラムで更新を行う必要がある場合は、変更を中央リポジトリからプルする必要があるかどうかを確認するか、必要に応じてコマンドラインを使用して新しい変更をコミットおよびプッシュする必要があるかどうかを確認できます。

ソース管理下のフォルダー内のテキスト ファイルにシリアル化されたデータを書き込める限り、問題はありません。コミット/プッシュ時に手動で競合を解決する必要がありますが、それはどのバージョン管理システムでも予想されることです。

リモート リポジトリとローカル リポジトリの間で競合がほとんどまたはまったくないことを確認したい場合は、コミットする前にローカル コピーを常にプルさせます。そうすれば、競合が発生した場合でもローカルで処理できます。

それだけです。

于 2010-06-11T02:31:53.890 に答える