2011-12-16 46 views
11

Gần đây, chúng tôi đã thực hiện một hg copy của một thư mục trong kho lưu trữ của chúng tôi. Chúng tôi nghĩ rằng nó thực hiện điều gì đó như cp -ahg add và có thể gắn cờ bằng cách nào đó rằng tệp này đã được sao chép từ một tệp khác trong repo (vì vậy hg annotate hiển thị người bắt đầu ban đầu). Nhưng bây giờ có vẻ như là hg copy có nhiều thứ khác hơn thế. Tôi thực sự không thể tìm thấy nhiều về cách hoạt động của bản sao chính xác. Vì vậy:Bản sao hg làm gì?

  • Chính xác thì hg copy làm gì và điều trị đặc biệt này gây ra điều gì trong tương lai?
  • Nếu hóa ra là "điều sai (tm)" đối với trường hợp của chúng tôi, làm cách nào để hủy liên kết tệp như đang sao chép một tệp khác?

(Câu hỏi này đã được hỏi về mailinglist Mercurial, bạn có thể muốn follow the original thread quá.)

+0

Bạn cũng có thể đọc [Sao chép tệp] (http://tortoisehg.bitbucket.org/hgbook/1.7/mercurial-in-daily-use.html#chap:daily.copy) trong [Mercurial: The Definitive Guide ] (http://tortoisehg.bitbucket.org/hgbook/1.7/) cuốn sách. – Matus

Trả lời

14
  • Chính xác những gì hg bản sao làm và những gì đối xử đặc biệt không gây này trong tương lai?

Nó thêm tệp mới và đánh dấu chúng là bản sao của tệp cũ. Vì chúng là bản sao, một thay đổi được thực hiện trong tệp gốc sẽ được hợp nhất thành bản sao. Thời gian dòng chảy từ trái sang phải:

(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt) 
     \     /
     (hg copy a.txt b.txt) 
  • Nếu nó quay ra để làm 'điều sai (tm) đối với trường hợp của chúng tôi, làm thế nào tôi unflag nội dung tập tin beeing một bản sao của tập tin khác ?

Cơ chế này chỉ khởi động khi bạn hợp nhất. Nếu b.txt không có trong số sửa đổi tổ tiên chung (init trong biểu đồ trên), thì Mercurial sẽ thực hiện tìm kiếm ngược lại để xem nếu b.txt được sao chép từ một nơi khác.

Chúng ta hãy tiếp tục biểu đồ trên ở dạng viết tắt:

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

Câu hỏi đặt ra là làm sao hợp nhất chính thức được thực hiện. Điểm tổ tiên chung hiện là nút copy a b và tại đây cả hai ab đều có mặt. Điều này có nghĩa là rằng sẽ không có bất kỳ tìm kiếm nào cho các bản sao! Vì vậy, chỉnh sửa thứ hai để a wont được hợp nhất thành b.

Để kiểm tra lại, tôi đã thử nó ra:

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

Đây là bản sao, b bây giờ chứa chỉ 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" 

Đây là hợp nhất đầu tiên và chỉnh sửa để a đã được sao chép vào b:

$ cat b 
a 
aa 

Bây giờ chúng ta thực hiện thay đổi song song:

$ 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) 

Không có sao chép thêm làm :

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

Để tắt tính năng này ... bạn không thể thực sự vô hiệu hóa việc phát hiện bản sao . Nhưng như tôi hy vọng đã minh họa ở trên, nó sẽ không "làm phiền" bạn một lần nữa sau lần hợp nhất đầu tiên.

Nếu hợp nhất đầu tiên là sự cố, bạn có thể sử dụng hg resolve --tool internal:local để đặt lại tệp về trạng thái trước khi bạn bắt đầu hợp nhất. Vì vậy, với

$ hg resolve --tool internal:local b 

chúng ta có thể đã mang lại b trở lại chỉ chứa một dòng với a.

+0

Xin lỗi, ** không thể ** xác nhận các thay đổi sao chép trên các trình kết hợp trong bài kiểm tra * my *. '> hg phiên bản SCM phân phối Mercury (phiên bản 2.0.1)' –

+0

Cũng không phải trong lần hợp nhất đầu tiên? Vui lòng viết [email protected] để chúng tôi có thể thảo luận đầy đủ ở đó, tốt hơn nhiều so với các hộp bình luận nhỏ này :) –

+0

"Cũng không phải trong lần hợp nhất đầu tiên?" - Vâng. e-mail lưu ý, tin nhắn sẽ được gửi (với các bản ghi) –

Các vấn đề liên quan