2009-05-28 28 views
58

Tôi có một kho chứa Mercurial chứa một số dự án liên quan. Tôi muốn chi nhánh chỉ là một trong những dự án này để làm việc trên nó ở nơi khác.Làm cách nào để sao chép một thư mục con của một kho lưu trữ trong Mercurial?

Nhân bản chỉ là một phần của kho lưu trữ có thể, và đó có phải là cách phù hợp để đạt được điều này không?

+0

Từ những gì tôi đã nghe, đây là một lý do để không đưa một số dự án vào một repo. –

Trả lời

51

Điều bạn muốn là narrow or partial clone, nhưng rất tiếc là chưa được hỗ trợ.

Nếu bạn đã có một kho lưu trữ lớn và bạn nhận ra rằng nó sẽ có ý nghĩa để chia thành nhiều kho nhỏ hơn, sau đó bạn có thể sử dụng convert extension để thực hiện Mercurial to Mercurial conversion. Lưu ý rằng điều này tạo ra kho mới foo và bạn không thể đẩy/kéo giữa your-big-repofoo.

Các convert extension không được kích hoạt theo mặc định để thêm dòng sau vào tập tin hgrc của repo của bạn hoặc mercurial.ini tập tin của bạn:

[extensions] 
hgext.convert= 

Sau đó tạo một file map.txt với

include "libs/foo" 
rename "libs/foo" . 

(lưu ý bạn có thể sử dụng chuyển tiếp ngay cả trên Windows) và chạy

$ hg convert --filemap map.txt your-big-repo foo 

Điều đó sẽ làm cho foo một kho lưu trữ có toàn bộ lịch sử của thư mục libs/foo từ your-big-repo.

Nếu bạn muốn xóa tất cả bằng chứng của foo từ your-big-repo bạn có thể thực hiện một chuyển đổi khác khi bạn sử dụng exclude libs/foo để loại bỏ thư mục.

Khi bạn có nhiều kho lưu trữ như vậy và bạn muốn sử dụng chúng như một toàn thể, thì bạn nên xem subrepositories. Tính năng này cho phép bạn bao gồm các kho lưu trữ khác trong thanh toán - tương tự như cách hoạt động của svn:externals. Vui lòng theo dõi recommendations trên trang wiki đó.

+0

Cảm ơn - Tôi đã tìm được giải pháp cho những gì tôi cần làm. Thú vị khi thấy các vấn đề liên quan. –

+27

Giải pháp thay thế mà bạn có thể đưa ra là gì? –

+20

Argh! "Tôi đã khám phá ra một bằng chứng tuyệt vời về điều này, biên độ này quá hẹp để chứa đựng." – Matt

3

Không thể, hg clone sẽ sao chép toàn bộ kho lưu trữ.

Bạn có thể xem xét tiện ích mở rộng của kho phụ cho phép bạn có kho lưu trữ bên trong một kho lưu trữ, có thể phù hợp với nhu cầu của bạn.

11

Thay vì thực hiện một bản sao một phần, bạn có thể sử dụng Convert Extension để chia repo của bạn thành nhiều hơn một repo theo kho phụ.

Cụ thể, xem phần, Converting from Mercurial:

Nó cũng hữu ích để lọc kho Mercurial để có được các tập con của một hiện có. Ví dụ để biến đổi một subfoo thư mục con của một foo kho vào một kho lưu trữ với cuộc sống riêng của mình (trong khi vẫn giữ lịch sử đầy đủ của nó), làm như sau:

$ echo include subfoo > /tmp/myfilemap 
$ echo rename subfoo . >> /tmp/myfilemap 
$ hg convert --filemap /tmp/myfilemap /path/to/repo/foo /tmp/mysubfoo-repo 
2

Đây là thẳng về phía trước với Convert extension.

+0

Đây là một giải pháp rất hợp lệ, tại sao nó được bình chọn -1? – cheenu

+1

Tôi đoán là vì giải pháp không thực sự cho phép bạn sao chép một thư mục con từ kho lưu trữ. Thay vào đó, nó cho phép bạn chuyển đổi một kho lưu trữ hiện có thành một kho lưu trữ mới và nhỏ hơn mà sau đó bạn có thể sao chép. –

+5

1) Như đã nêu ở trên, bạn không trả lời câu hỏi mà câu hỏi ban đầu được hỏi. 2) Bạn không giải thích rằng câu hỏi ban đầu được yêu cầu là không thể. Bạn chỉ cần cung cấp một cái gì đó khác nhau. 3) Bạn đưa ra một liên kết, thay vì thực sự giải thích. –

6

Tôi đã vấp accross vấn đề này và tìm thấy một cách để làm điều đó: Sử dụng liên kết tượng trưng (Linux chỉ may)

Ví dụ, nếu bạn chỉ cần /project trong kho, trên bản sao máy tính của bạn repo trong một thư mục, sau đó sử dụng ln -s /repo/location/ project. Mercurial sẽ xử lý nó

1

(cuối năm 2016) Mercury vẫn không hỗ trợ cho "nhái hẹp" nhưng có phần mở rộng của bên thứ ba giải quyết vấn đề theo nhiều cách khác nhau.

Nếu bạn có thể đối phó với chỉ một hẹp thanh toán (aka "thưa thớt thanh toán" hoặc "thanh toán một phần bằng đường dẫn tập tin") sau đó sparse.py phần mở rộng của Facebook từ hg-experimental repository (nhìn vào bên trong thư mục hgext3rd/) có thể là hoàn toàn khả thi. Trong trường hợp này, bạn vẫn sao chép toàn bộ lịch sử (do đó thư mục .hg không nhỏ hơn) nhưng thư mục làm việc của bạn chỉ hiển thị/hoạt động trên một tập con của kho lưu trữ đầy đủ.

Hoặc Google đã tạo một NarrowHG extension làm hẹp nhân bản (còn gọi là "nhân bản từng phần theo đường dẫn tệp"). Bạn sẽ cần phải kiểm soát máy chủ, máy khách và sẵn sàng sử dụng các tính năng thử nghiệm nhưng nó thực sự hạn chế lịch sử sao chép của bản sao trong .hg đến một tập con của những gì đã có trong kho gốc.

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