簡體   English   中英

hg拷貝有什么作用?

[英]What does hg copy do?

我們最近在我們的存儲庫中做了一個目錄的hg copy 我們認為它做的事情就像cp -ahg add並且可能標記這個文件已經從repo中的另一個文件復制(所以hg annotate顯示原始提交者)。 但現在看來, hg copy做的更多或不同。 我真的找不到復制的確切方式。 所以:

  • hg copy究竟做了什么以及這將在未來引起什么特殊處理?
  • 如果事實證明對我們的案例做了“錯誤的事情(tm)”,我該如何取消文件作為另一個文件的副本?

(這個問題是在Mercurial郵件列表中提出的,您可能也想跟隨原始帖子 。)

  • hg拷貝究竟做了什么以及這將在未來引起什么特殊處理?

它添加新文件並將其標記為舊文件的副本。 因為它們是副本,所以原始文件中的更改將合並到副本中。 時間從左到右流動:

(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt)
      \                     /
       (hg copy a.txt b.txt)
  • 如果事實證明對我們的案例做了“錯誤的事情(tm)”,我如何取消文件作為另一個文件的副本?

合並時,此機制才會啟動。 如果共同的祖先修訂版中沒有b.txt (上圖中的init),那么Mercurial將向后搜索以查看是否從其他地方復制了b.txt

讓我們以縮寫形式繼續上面的圖表:

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

問題是最終合並是如何完成的。 共同的祖先點現在是copy ab節點,這里存在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

如何將文件作為另一個文件的副本取消標記?

如果您還原hg副本,則復制到的文件將保留在您的工作目錄中,未跟蹤。 你只需要正常添加它。 復制的文件根本不受影響。

% hg copy file new-file
% hg status -C
A new-file
__file
% hg revert new-file
% hg add new-file
% hg status -C
A new-file

參考: Mercurial權威指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM