2009-11-24 24 views
6

Có cách nào để sao lưu một kho lưu trữ thủy ngân trong khi vẫn giữ dấu thời gian của các tập tin không?Sao lưu một kho chứa thủy ngân trong khi vẫn giữ dấu thời gian

Hiện tại, tôi đang sử dụng hg clone để sao chép kho lưu trữ vào thư mục dàn dựng và chương trình sao lưu sẽ lấy các tệp từ đó. Tôi không chỉ chương trình sao lưu trực tiếp tại kho lưu trữ vì tôi không muốn nó thay đổi (từ cam kết) trong khi sao lưu đang xảy ra.

Vấn đề là hg clone thay đổi tất cả dấu thời gian của tệp thành thời gian hiện tại, vì vậy chương trình sao lưu (mà tôi không thể thay đổi) nghĩ rằng mọi thứ đã được sửa đổi.

Trả lời

5

Tôi khuyên bạn nên sử dụng hg pull thay vì hg clone. Vì vậy, bạn sẽ giữ một tấm gương của kho lưu trữ trên máy chủ của bạn và cập nhật nó theo định kỳ với hg pull. Sau đó, bạn hãy để chương trình sao lưu của mình sao lưu . Khi bạn sử dụng hg pull, bạn sẽ chuyển lịch sử mới nhất và chỉ thay đổi tệp dưới .hg/store/data đã thực sự được thực hiện bằng thao tác kéo.

Ở đây tôi đã thử nghiệm điều này bằng cách tạo một repo nhỏ với hai tệp: a.txtb.txt. Sau đó tôi nhân bản kho lưu trữ "tới máy chủ" bằng cách sử dụng hg clone --noupdate. Điều đó đảm bảo rằng chúng tôi không có bản sao làm việc trên máy chủ - nó chỉ cần lịch sử được tìm thấy trong .hg.

Các timestamps trông như thế này sau khi clone: ​​

 
% ll --time-style=full .hg/store/data 
total 8.0K 
-rw-r--r-- 1 mg mg 76 2009-11-25 20:07:52.000000000 +0100 a.txt.i 
-rw-r--r-- 1 mg mg 69 2009-11-25 20:07:52.000000000 +0100 b.txt.i 

Như bạn đã nói, tất cả chúng đều giống hệt nhau từ các tập tin đã được tất cả chỉ được tạo ra bởi các hoạt động clone. Sau đó tôi đã thay đổi kho lưu trữ ban đầu (kho lưu trữ trên máy khách) và thực hiện một cam kết. Sau khi kéo changeset Tôi đã nhận những timestamps:

 
% ll --time-style=full .hg/store/data 
total 8.0K 
-rw-r--r-- 1 mg mg 159 2009-11-25 20:08:47.000000000 +0100 a.txt.i 
-rw-r--r-- 1 mg mg 69 2009-11-25 20:07:52.000000000 +0100 b.txt.i 

Thông báo như thế nào dấu thời gian cho a.txt.i đã được cập nhật (tôi chỉ chạm a.txt trong tôi cam kết) trong khi dấu thời gian cho b.txt.i đã được bỏ lại một mình.

Nếu phần mềm sao lưu của bạn thông minh, thậm chí nó sẽ thông báo rằng Mercurial chỉ thêm dữ liệu vào a.txt.i. Điều này có nghĩa là tệp a.txt.i mới giống với tệp cũ a.txt.i lên đến điểm nhất định - do đó chương trình dự phòng nên chỉ sao chép phần cuối cùng của tệp. Rsync là một ví dụ về một chương trình sao lưu sẽ thông báo điều này.

6

Kế hoạch A: Khi nguồn và đích danh bạ nằm trên cùng hệ thống tập tin, hg clone -U sẽ chỉ đơn giản là hardlink tất cả các file của nó trong kho, mà không thay đổi timestamps. Cách tiếp cận này khá nhanh và luôn an toàn (các tệp được bỏ liên kết một cách lười biếng khi được ghi vào).

Nếu cần, trước tiên bạn có thể sao chép trên cùng một hệ thống tệp và sau đó rsync bản sao mới này sang hệ thống tệp khác.

Gói B: Đó là Thường là an toàn để sử dụng rsync hoặc một số công cụ đồng bộ hóa dựa trên tệp khác. Mercurial không lưu trữ bất cứ điều gì huyền diệu trên đĩa, chỉ là các tập tin đơn giản.

Có điều kiện chủng tộc, khi bạn thực hiện cam kết lưu trữ này cùng lúc khi rsync đang chạy, nhưng tôi cho rằng nó không đáng kể vì "hg rollback" sẽ có thể xóa các mâu thuẫn của bạn nếu bạn khôi phục từ một bản sao lưu bị hỏng. Lưu ý rằng khôi phục không thể khôi phục nếu bạn có nhiều giao dịch riêng biệt (như nhiều lệnh "đẩy" hoặc "cam kết") trong cửa sổ rsync hoặc chạy các hoạt động phá hoại giả mạo lịch sử (chẳng hạn như rebase, hg strip và một số Lệnh MQ).

+0

Vâng, đó là tình trạng cuộc đua mà tôi lo lắng. Bạn có thể biết khi nào cần có 'hg rollback'? –

+0

'hg verify' sẽ kiểm tra tất cả các tổng kiểm tra/băm trong kho của bạn và khiến bạn bị lỗi. – intgr

+0

Một bình luận thêm về điều này (bạn có thể muốn thêm): 'hg clone -U' là cách để đi, vì bản sao làm việc sao chép làm cho không có liên kết cứng. Chỉ cần kho lưu trữ. –

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