2011-12-16 47 views
11

我們最近做了一個hg copy我們的存儲庫中的一個目錄。我們認爲它 做類似cp -ahg add,也許標誌不知何故 這個文件已經從回購裏面的另一個文件複製(所以hg annotate顯示原始提交者)。但現在看來,hg copy做了比這更多或不同的東西。我無法真正找到 很多關於如何完全複製的作品。所以:hg copy做什麼?

  • 究竟是什麼hg copy做,什麼特殊待遇做到這一點 事業的未來?
  • 如果事實證明我們的情況是「錯誤的(t​​m)」,我如何將文件取消標記爲另一個文件的副本?

(這個問題被問的水銀郵件列表,你可能要follow the original thread了。)

+0

您還可以在[Mercurial:權威指南]中閱讀[複製文件](http://tortoisehg.bitbucket.org/hgbook/1.7/mercurial-in-daily-use.html#chap:daily.copy) ](http://tortoisehg.bitbucket.org/hgbook/1.7/)一書。 – Matus 2016-11-10 00:45:25

回答

14
  • 究竟汞柱副本做什麼和什麼特殊待遇做到這一點 事業的未來?

它添加新文件並將它們標記爲舊文件的副本。由於它們是副本,原始文件中所做的更改將被合併到副本中。時間流從左至右:如果它原來是爲我們的情況做「錯誤的事情(TM)」

(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt) 
     \     /
     (hg copy a.txt b.txt) 
  • ,我怎麼 取消標記該文件作爲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不會 被合併到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

$ cat b 
a 
aa 

我們現在在平行進行更改:

$ 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 a 
a 
aa 
aaa 
$ cat b 
a 
aa 
bbb 

至於禁用此...你真的不能明確禁用複製 檢測。但正如我希望上面所說明的那樣,在第一次合併之後,它不會再「打擾」你 。

如果第一次合併是一個問題,那麼在 開始合併之前,可以使用hg resolve --tool internal:local將文件重置爲其狀態。因此,與

$ hg resolve --tool internal:local b 

我們可以帶來b回到剛纔包含一個符合a

+0

對不起,**無法**確認* my *測試中合併頭上的複製更改。 `> hg version Mercurial分佈式SCM(版本2.0.1)` – 2011-12-16 15:55:24