2010-08-08 29 views
18

Có cách nào để sao chép một repo đi kèm với subrepos, nhưng không có Mercurial kéo tất cả các subrepos?Mercurial `hg clone` nhưng bỏ qua tất cả subrepos?

Có vẻ như trong khi hg clone -U có thể được sử dụng để lấy bản sao trống của repo, không có gì thuyết phục được hg update để tránh bắt đầu bằng cách kéo tất cả các phân đoạn phụ.

Tôi nên chỉ ra rằng điều quan trọng là duy trì khả năng dễ dàng đồng bộ hóa với bản sửa đổi đầu sau khi tạo bản sao như vậy.

Trả lời

5

Câu trả lời này có thể thêm nhiều hơn các câu hỏi bắt buộc, nhưng cung cấp một số giấy tờ có giá trên làm việc với Mercurial khi bạn không thể cập nhật làm gì để một con đường subrepository xấu hoặc sửa đổi.

Bước 1: Sao y kho mà không cần bất kỳ bản cập nhật

hg clone --noupdate source_repository destination_repository 

Bước 2: Sử dụng trở lại để có được các tập tin ngay

hg revert --all --rev revision_number --exclude subrepo_1 --exclude subrepo_2 ... 

Tại thời điểm này, bạn có một changeset mới; bạn có thể cần phải chắc chắn rằng bản sửa đổi của phụ huynh là chính xác. Khi tôi đã làm điều này, cha mẹ của changeset mới của tôi là changeset 0. Để sửa lỗi này, tôi phải thiết lập parent changeset AND switch branch (kể từ khi changeset của tôi nằm trên một nhánh khác).

Bước 3: Thay đổi phụ huynh của dòng điện thay đổi

hg debugsetparents revision_number 
hg branch branch_name 

Điều đó sẽ làm điều đó.

+2

Sau Bước 3, 'trạng thái hg' vẫn hiển thị tất cả các tệp đang chờ xử lý. Chạy 'hg debugrebuildstate -r tip' sửa lỗi đó. –

3

Nếu bạn có một subrepo, một thư mục hoạt động phải bao gồm một số phiên bản của phụ đề đó. Phiên bản đó có thể là bản sửa đổi cũ cố định nếu được chỉ định hoặc mẹo nếu không.

Bạn không thể cập nhật repo của mình mà không nhận được phụ đề; nếu bạn có một thư mục làm việc hoàn chỉnh mà không có chúng, bạn không nên sử dụng subrepos - thay vào đó hãy sử dụng repos thực sự bên ngoài.

Nếu subrepos của bạn được gắn với một phiên bản từ xa nhất định, sau đó cập nhật sau lần đầu tiên sẽ không kích hoạt cập nhật subrepo - chúng đã được cập nhật. Nhưng đối với việc tạo thư mục làm việc ban đầu, bạn sẽ phải thực hiện một thao tác kéo từ xa.

Bạn có thể đánh lừa Mercurial bằng cách nén tệp hgsubstate. Nhưng thực sự, mô hình của bạn và mô hình khái niệm khác nhau, vì vậy bạn có thể không phù hợp với subrepos nếu đây là một mối quan tâm.

chỉnh sửa: Nếu bạn thấy mình nhân bản và sau đó cập nhật lên đầu nhiều lần, hãy thử sử dụng các nhánh địa phương hoặc mq để thay thế. Bằng cách đó bạn chỉ phải thực hiện bản sao ban đầu một lần.

+0

Dường như chúng phù hợp với hầu hết thời gian. Nó chỉ là subrepos là lớn, và cách tốt nhất để chống lại các "máy chủ" chính thức mà tôi tìm thấy là để giữ một thanh toán địa phương sạch. Các subrepos thêm một tấn trên không cho phương pháp này. –

+0

@romkyns: nếu bạn chỉ muốn theo dõi những gì bạn đã thay đổi, hãy sử dụng 'hg out' (hoặc' hg diff' cho các thay đổi không được cam kết). Hoặc bạn chỉ có thể tạo bản sao "sạch" một lần và sử dụng 'hg kéo -u' trên nó thỉnh thoảng để giữ cho nó cập nhật ... – Borealid

+0

Cảm ơn, tôi đoán tôi sẽ phải chịu đựng một loạt các bản sao bổ sung những subrepos khổng lồ này. Tôi tìm thấy suboptimal 'hg diff' để xem xét mã và sử dụng thay thế dựa trên GUI bên ngoài. –

4

Tìm cách hacky. Nó vẫn yêu cầu tất cả các subrepos được kiểm tra một lần, nhưng sau đó chúng có thể bị xóa.

  1. Sao chép toàn bộ lô, bao gồm cả phụ trang. Không còn cách nào khác.
  2. subrepos Xóa
  3. hg remove .hgsub

Tôi cố gắng để thuyết phục Mercurial để hg remove .hgsub trước subrepos được nhân bản, nhưng tốt nhất tôi có là not removing .hgsub: file is untracked.

+6

Đây là một sự xấu hổ. –

+6

Giải pháp này thực sự không giúp ích nếu subrepo bên ngoài của bạn không thể truy cập được vì một lý do nào đó. Một số cuộc thảo luận về bỏ qua subrepos [ở đây] (http://mercurial.selenic.com/bts/issue2520). –

13

này nên làm những gì bạn muốn:

REM Take a new clone, but do not update working directory 
hg clone --noupdate %REPO_PATH% %DESTINATION% 

REM Update working directory but exclude the certain subprojects 
hg revert --all --rev %BRANCH% --exclude %SUBREPO_PATH_1% --exclude %SUBREPO_PATH_2% 
Các vấn đề liên quan