これらの各 VCS は名前の変更をどのように処理しますか?
git はファイルではなく LOC (コード行) を追跡するため、名前の変更は意味をなさないという矛盾する情報が多数見つかりました。
これらの各 VCS は名前の変更をどのように処理しますか?
git はファイルではなく LOC (コード行) を追跡するため、名前の変更は意味をなさないという矛盾する情報が多数見つかりました。
hg mv
使用する必要があります。hg addremove --similarity
マージ中にヒューリスティックを追加するという話もありました。Gitは、名前変更の追跡を行わないという点で異なります。つまり、SCMコマンドを使用して名前を変更する(または自動検出スクリプトを実行してコミット前に名前を変更する)ことで名前変更について通知する必要がなく、保存されません。リポジトリ内のそのような情報ですが、名前変更の検出を行います。-M
これは、マージ中と、オプションを介して要求された場合(またはdiff.renames
configオプションを使用して構成された場合)のdiffの両方で、ファイル名とファイルの内容の類似性に基づくヒューリスティックアルゴリズムを使用して名前変更を検出することを意味します。
この方法の利点は次のとおりです。
pathspecフィルタリングは、名前変更の検出ではうまく機能しないことに注意してください。git log --follow <filename>
名前の変更を超えてファイルの履歴を追跡する場合は、「 」を使用します
実際には:
Git は名前の変更を自動的に検出します。(ちなみに、あるファイルから別のファイルに関数を移動したときに git が検出できるという主張を聞いたことがあります。しかし、私の最初のテストでは、そうではないことが示されているようです。)
hg mv
Mercurial では、 、または の--similarity
オプションhg addremove
、TortoiseHg の「名前の推測」オプション、または VisualHg などの特定のツールを使用して、名前の変更について明示的に伝える必要があります。Mercurial で Git アプローチを使用する場合は、コミット時に名前の変更を検出する拡張機能を作成しましたが、現時点では非常に実験的な段階にあります。
Subversion は名前の変更をまったく処理しません。名前の変更は、1 つのファイルが削除され、別のファイルが追加されたものとして記録されます。これは、たとえば、アリスがファイルを変更し、ボブがそのファイルの名前を変更した場合、ツリーの競合が発生することを意味します。これは、本格的な分岐とマージを行っている場合でも、単純にsvn update
. 名前の変更の追跡は、来年中に予定されている Subversion 1.8 で計画されています。
あなたは正しいことを聞いたことがあります。
Git はファイル自体ではなくファイルの内容を操作するため、名前の変更は技術的に意味がありません。git にとって、名前の変更は、ファイル A が消え、ファイル B が A と同じ内容で表示されたように見えます。しかし、実際には、ファイルが実際にいつ名前変更されたかを把握するのに git はかなり優れています。
試してみてください: ファイルの名前を変更し、'git rm oldname' と 'git add newname' を実行して、変更をステージングするように git に指示します。次に、'git status' を実行して、git が何をしていると考えているかを確認します。ファイルの名前が変更されました。それが後で何を意味するかはわかりませんが。「git show」でコミットを見ると、名前の変更についての言及は見られず、あるパスから削除されて別のパスに追加された一連の行だけが表示されます。
または、「git mv」コマンドを使用してファイルの名前を変更することもできます。git が操作を認識する方法は変わりません。「mv oldname newname」、「git rm oldname」、および「git add newname」を 1 つのステップで効果的に実行するだけです。
Mercurial の概要については、tonfa's answerを参照してください。
一方、SVN は名前の変更を検出できませんが、'svn mv' コマンドで名前を通知する必要があります。ただし、名前変更を「ファーストクラス」の変更として追跡するため、後で変更ログを表示すると、変更が名前変更であったことがわかります。
ただし、この機能に基づいて git または mercurial よりも SVN を選択することはお勧めしません。ツール間には、はるかに大きく重要な違いがあります。最初に、分散バージョン管理システム (git または mercurial) が必要か、集中型バージョン管理システム (svn) が必要かを決定します。
ヒューリスティックを使用して名前変更が行われたかどうかを判断することに加えて、まだ言及されていないgitに関するもう1つのこと:
ファイルまたはディレクトリツリー全体の名前が変更、コピー、または移動され、その下にあるものが何も変更されていない場合、ファイルまたはツリーは実際にはリポジトリ内に同じオブジェクトとして保存され、余分なものは必要ありません。スペース。
変更すると、通常どおり、新しいオブジェクトとして保存されます。
hgとsvnについてはよくわかりませんが、チェンジリスト指向のアーキテクチャーは、このシナリオでは動作が異なることを意味していると思います。リポジトリ内の巨大なツリーを移動またはコピーすることを避ける理由が得られる場合を除いて、実際には使用法に影響はありません。
git は、ファイルではなくコンテンツを追跡します。Mercurial についてはよくわかりませんが、名前の変更について svn に明示的に通知する必要があります