2010-10-17 31 views
8

Tôi có 3 kho, mỗi kho được tạo với cùng một cơ sở mã nhưng đủ khác nhau để đảm bảo các kho lưu trữ khác nhau. Luồng công việc "mơ ước" của tôi sẽ là làm việc trong kho lưu trữ phát triển và sau đó kéo những thay đổi này vào các kho lưu trữ khác. Tôi biết tôi có thể làm điều này với một cái gì đó như:kéo tệp từ một bản sửa đổi cụ thể - mercurial

hg pull -r X -f repo 

nhưng điều này sẽ cho tôi tất cả changesets lên đến X. Có thể chỉ cần kéo tất cả các changesets từ một phiên bản cụ thể hoặc thậm chí từ một loạt các phiên bản?

Trả lời

7

Nếu bạn muốn lấy nội dung của changesets nhất định và áp dụng chúng vào một thanh toán tùy ý (lưu ý: changesets kết quả sẽ là changesets khác nhau, ngay cả khi họ làm cho thay đổi cùng), hãy xem tại số transplant extension.

+0

Điều này gần như mang lại cho tôi những gì tôi muốn ngoại trừ khi một xung đột xảy ra, tôi nhận được những tệp .rej thay vì đưa tôi một công cụ hợp nhất. Bạn có biết cách nào dễ dàng để xử lý những thứ đó .rej thay vì phân tích cú pháp chúng theo cách thủ công và giải quyết xung đột? – mdonovan2010

+0

Dành cho người đọc mới hơn đang tìm cách giải quyết vấn đề: Xem câu trả lời được cập nhật của tôi bên dưới để biết giải pháp tích hợp, hoạt động tốt. – Lstor

8

Không có tốt cách thức để chọn các bản chỉnh sửa lựa chọn bằng ngọc trai (đó là quy trình làm việc được đề xuất của bạn). Có một số cách không tuyệt vời để thực hiện: xuất + nhập (hoặc trình bao bọc tiện lợi xung quanh xuất + nhập được gọi là ghép), nhưng vẽ lại có bạn có cùng changeset với các băm khác nhau trong nhiều kho, không tốt cách để thể hiện rằng nếu/khi bạn cố gắng di chuyển các thay đổi trên một lần nữa.

Tốt hơn là sửa đổi quy trình làm việc của bạn để khi bạn muốn di chuyển qua thay đổi bạn đồng ý với việc di chuyển trên tất cả tổ tiên của nó, và bạn làm điều này bằng cách chọn một tổ tiên của changeset.

Ví dụ: nếu bạn đang khắc phục lỗi trong kho lưu trữ phát triển và cả ba "kho" khác không chỉ thay đổi bản sửa đổi gốc của thay đổi là tip của kho lưu trữ phát triển. Trước tiên, hãy thực hiện hg update -r THE_REVISION_WHERE_THE_BUG_WAS_ADDED, sau đó sửa lỗi của bạn và sau đó cam kết. Bạn sẽ thấy thông báo có nội dung là new head created.

Bây giờ bạn đã có sửa chữa như là một changesets mà chỉ có cha mẹ là changeset trong đó lỗi đã được giới thiệu - mà phải tồn tại trong 3 kho khác hoặc họ sẽ không có lỗi. Vì vậy, bây giờ bạn có thể pull rằng changeset mới vào "3" kho khác mà không mang lại tất cả mọi thứ khác trong phát triển với họ. Và sau đó bạn thực hiện một cách nhanh chóng hg merge trong mỗi bốn kho lưu trữ đó, trộn lẫn sửa lỗi vào khả năng triển khai tip.

Nhận được cách xử lý kho lưu trữ cấu trúc có chức năng chung nhưng tùy chỉnh trong mỗi, có thể hơi phức tạp, nhưng nếu bạn cấu trúc mọi thứ đúng, bạn có thể thực hiện tất cả các chuyển đổi nội bộ bằng cách sử dụng push, pull và merge và không bao giờ phải sửa lỗi hai lần, có cùng mã trong các thay đổi khác nhau hoặc làm lại tùy chỉnh của kho lưu trữ.

Như một lưu ý, lệnh chia đôi, thực hiện một công việc tuyệt vời để trả lời câu hỏi "lỗi này đã được giới thiệu ở đâu" trước khi bắt đầu sửa lỗi.

+0

Nếu tôi hiểu điều này một cách chính xác, luồng công việc này hoạt động nếu tất cả các kho lưu trữ có thể được truy tìm đến một changeset phổ biến? Trong tình huống của tôi, đây không phải là trường hợp. – mdonovan2010

+0

Vâng, tôi nhận ra nó không phải là, nhưng và tôi có nghĩa là điều này mà không có âm thanh "phán xét" họ nên. Bất kể việc triển khai tùy chỉnh của bạn như thế nào nếu chúng có một số mã chung, chúng sẽ được nhân bản bằng các bộ thay đổi của riêng chúng mà tùy chỉnh - hoặc nên chia sẻ subrepos nếu bạn có một số mã thư viện chung giữa chúng. Nó sẽ là một yếu tố tái, nhưng nó sẽ giúp bạn có được dòng chảy công việc "; mơ", bạn tham khảo ở trên. –

+0

Có quyền của bạn. Tôi trễ đến cổng với phiên bản kiểm soát các trang web mặc dù ... mercurial có vẻ như sự lựa chọn hoàn hảo cho những gì tôi đã làm nhưng refactoring tất cả mọi thứ chỉ để đạt được ước mơ của tôi có thể không làm cho chủ nhân của tôi rất hạnh phúc;) đầu vào của bạn, nó chắc chắn đã giúp tôi hiểu rõ hơn cách Mercurial hoạt động) – mdonovan2010

7

Câu trả lời cập nhật: Từ Mercurial 2 trở đi, bạn có thể sử dụng lệnh 'graft' hoạt động tốt. Nó sử dụng một số khả năng hợp nhất nội bộ để đảm bảo bạn có thể xử lý bất kỳ xung đột nào theo cách thủ công. Nếu không có xung đột mà Mercurial không thể tự giải quyết, thì changeset mới được tự động hóa và được cam kết trên bản sửa đổi hiện tại của bạn.

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