2011-12-16 10 views
11

最近、私たちのリポジトリにディレクトリのhg copyがありました。 はcp -ahg addのようになり、何らかの形でフラグが付けられています このファイルはrepo内の別のファイルからコピーされています(したがってhg annotateは元のコミッタを示しています)。しかし、今はhg copyがそれより多くの、または異なるものをするようです。私は実際にどのくらい正確にコピーが動作するかについて多くを見つけることができなかった。 だから、:hgコピーは何をしますか?

  • hg copyは正確に何をするのか、特別な何の治療は、将来的にこの 原因していますか?
  • 私たちのケースで「間違ったこと(tm)」をすると、 は別のファイルのコピーとしてファイルのフラグを解除するにはどうすればよいですか?

(この質問はMercurialのメーリングリストに頼まれた、あなたもfollow the original threadしたいことがあります。)

+0

[Mercurial:The Definitive Guide]の[ファイルのコピー](http://tortoisehg.bitbucket.org/hgbook/1.7/mercurial-in-daily-use.html#chap:daily.copy)も参照できます。 ](http://tortoisehg.bitbucket.org/hgbook/1.7/)の本。 – Matus

答えて

14
  • HGコピーは正確に何をするのか、特別なものを治療、将来的にこの 原因していますか?

新しいファイルが追加され、古いファイルのコピーとしてマークされます。これらはコピーであるため、元のファイルで行われた変更がコピーにマージされます。時間は左から右に流れて:

(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt) 
     \     /
     (hg copy a.txt b.txt) 
  • 、それは我々の場合のための「間違ったこと(TM)」を行うが判明した場合、どのように私は別のファイルのコピーをbeeingてのファイルをフラグ解除 ん?

このメカニズムは、マージするときにのみ起動します。 b.txtが の共通の祖先リビジョン(上のグラフのinit)に存在しない場合、Mercurialは を逆方向に検索してb.txtが他の場所からコピーされているかどうかを確認します。質問は、最終的なマージがどのように行われるかである

(i) -- (edit a) -- (a edit copied to b) -- (edit a) -- (merge) 
    \   /        /
    (copy a b) --/------- (edit b) ------------------/ 

は、私たちは省略形で上記のグラフを続けましょう。共通の祖先ポイント はcopy a bノードになり、ここではabの両方が存在します。つまり、コピーを検索することはありません を意味します!したがって、aへの2回目の編集は となり、bに合併されます。

ダブルチェックするために、私はそれを試してみた:

$ hg init 
$ echo a > a 
$ hg add a 
$ hg commit -m init 
$ hg copy a b 
$ hg commit -m "copy a b" 

をこれは、コピーした、bは今だけaが含まれています。

$ hg update 0 
0 files updated, 0 files merged, 1 files removed, 0 files unresolved 
$ echo aa >> a 
$ hg commit -m "edit a" 
created a new head 
$ hg merge 
merging a and b to b 
0 files updated, 1 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 
$ hg commit -m "a edit copied to b" 

これは最初のマージだったとaに編集bにコピーされました:行ってこれ以上のコピーはありません

$ echo aaa >> a 
$ hg commit -m "edit a again" 
$ hg update 3 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
$ echo bbb >> b 
$ hg commit -m "edit b" 
created new head 
$ hg merge 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

:私たちは今、並行して変更を加える

$ cat b 
a 
aa 

$ cat a 
a 
aa 
aaa 
$ cat b 
a 
aa 
bbb 

これを無効にするために...あなたは実際にコピー の検出を明示的に無効にすることはできません。しかし、私が上記に示したがっているように、最初のマージの後にもう一度 あなたを "悩ます"ことはありません。

最初のマージが問題の場合、がマージを開始する前に、hg resolve --tool internal:localを使用してファイルを元の状態に戻すことができます。

$ hg resolve --tool internal:local b 

で、私たちはただaで1行を含むに戻っbを持ち込んでいることができるように。

+0

* my *テストでマージヘッドのコピー変更を**確認できません。 '> hg version Mercurial Distributed SCM(version 2.0.1)' –

+0

また、最初のマージではありませんか? [email protected]と記入してください。私たちはそこで完全に議論することができます。これらの小さなコメントボックスよりはるかに優れています:) –

+0

"最初のマージでもありませんか?" - はい。電子メールが表示され、メッセージは(ログ付きで)送信されます –

関連する問題