![](/img/trans.png)
[英]What files will be changed vs added when I do an hg pull and hg update
[英]What does hg copy do?
我們最近在我們的存儲庫中做了一個目錄的hg copy
。 我們認為它做的事情就像cp -a
和hg add
並且可能標記這個文件已經從repo中的另一個文件復制(所以hg annotate
顯示原始提交者)。 但現在看來, hg copy
做的更多或不同。 我真的找不到復制的確切方式。 所以:
hg copy
究竟做了什么以及這將在未來引起什么特殊處理? (這個問題是在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
節點,這里存在a
和b
兩者。 這意味着不會有任何副本搜索! 所以,第二個編輯到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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.