DVCS (DRCS) はどのように機能しますか?
-
09-06-2019 - |
質問
DVCS システム、特にバザールについて、良いことをたくさん聞いています。分散リポジトリの概念とは別に、次の 2 つの主な利点が宣伝されていると思います。マージはより自動化され、名前変更は適切に処理されます。
誰かが改善がどのように正確に機能するかを説明したテキストを教えてもらえますか?バザールは私がファイル名を変更したことをどのようにして知るのでしょうか?同じコミットの一部として 2 つのファイルの名前を変更した場合はどうなりますか?ファイルの内容の半分を新しいファイルに入れ、すべてを再インデントし、ほぼすべての行の空白を失ってリファクタリングするとどうなりますか?
言い換えれば、実際にバザール (または別の DVCS) を使用している人、またはそれがどのように機能するかを知っている人からの意見を聞きたいのです。マージは本当に改善されたのでしょうか?そしてそれはどのように達成されるのでしょうか?
関連する質問と役立つ回答:
解決
DVCS ではマージが本質的に優れているわけではありません。ブランチ/マージが正しく機能しなかった場合 (おそらく svn はブランチ/マージを正しく実装していません)、チェックアウトを行う代わりにマージを使用するのが実際上非常に困難になるだけです。既存のコードからプロジェクトの作業を開始するたびに、新しいブランチを作成します。一部の独自の集中型 SCS はマージ/ブランチを正しく処理すると思います。
これらすべてで機能する方法は、すべてのコミットを直接非巡回グラフ (DAG) に記録することです。これにより、さまざまなマージ戦略が利用可能になります。ここで詳細を確認できます。
http://revctrl.org/CategoryMergeAlgorithm
少なくとも hg、bzr、git は外部マージ ユーティリティを使用できます。
他のヒント
DVCS は、マージの親リビジョンを追跡することで、より適切なマージを実現します。Subversion では、あるブランチを別のブランチにマージすると、マージ元の場所に関する情報が失われます。Bazaar や Git のような DVCS では、「マージされた」リビジョンには 2 つの親リビジョンが含まれます。
名前変更は DVCS 間で異なる方法で処理されます。たとえば、Linus にとって名前変更は重要ではなかったため、Git は名前変更をまったく追跡しません。Mercurial はそれらを「古いファイルを新しいファイルにコピーし、古いファイルを削除」として記録します。 マーク・シャトルワース氏によると, Canonical の創設者、Darcs および Bazaar は、ファイルの名前変更を正しく処理する唯一の DVCS です。
バザールは私がファイル名を変更したことをどのようにして知るのでしょうか?
名前の変更は、ファイルの追加または削除と同様に、ユーザーによって指定されます。使用 "bzr rename <old> <new>
" コマンドを使用して、ファイルまたはディレクトリに名前変更のマークを付けます。すでにツリー内のファイルの名前を変更している場合は、「」を使用できます。--after
" オプション。
同じコミットの一部として 2 つのファイルの名前を変更した場合はどうなりますか?
次に、「」と入力します。bzr rename <old> <new>
" ファイルごとに 1 回。Bazaar は、どのファイルの名前が変更されたかを推測しようとしません。
ファイルの内容の半分を新しいファイルに入れ、すべてを再インデントし、ほぼすべての行の空白を失うことによってリファクタリングするとどうなりますか?
次に、「」と入力します。bzr add
実際に名前を変更しているわけではないので、新しいファイルに「」を付けます。
以下は、darcs (http://darcs.net) パッチを扱います - http://darcs.net/manual/node9.html.
Bazaar については詳しくありませんが、git はファイル名の変更を追跡しません。git にとって、これは削除と追加のように見えます。ただし、git はファイルの内容がリポジトリにすでに存在していることを認識し、システム内での位置を追跡するのに十分な機能を備えています。ファイルを分割またはマージする場合、コードのセグメント (BLOB) を追跡し、その情報も保存するのが賢明です。