2011-10-31 30 views
12

Gần đây tôi đã bắt đầu làm việc với MQ vì tôi thích ý tưởng làm việc trên các bản vá bị cô lập và cam kết mà không ảnh hưởng đến repo cho đến khi changeset được tinh chỉnh đủ. Trước đó, tôi đã từng làm việc với phần mở rộng của Mercurial, nhưng thấy nó hơi không ổn định. Những gì tôi vẫn đang cố gắng tìm ra trong MQ là làm thế nào để giữ các bản vá riêng biệt với nhau và áp dụng chúng không theo thứ tự cụ thể, và trên các nhánh khác nhau. Dưới đây là dòng chảy bình thường của tôi -Mercurial - Làm việc với hàng đợi tương tự như giá?

1. Bắt đầu làm việc trên một bản vá mới:

hg qnew fix-bug-1234 -m "fix bug 1234" 
# do some work 
hg qrefresh 

2. Nhận một tính năng mới/lỗi để làm việc trên:

hg qpop fix-bug-1234 
hg qnew some-feature -m "implement feature X" 
# some work on feature X (perhaps in a different branch) 
hg qrefresh 

Tại thời điểm này, tôi muốn quay trở lại để làm việc trên bugfix, và đặt sang một bên các tính năng làm việc. Tôi nghĩ rằng nó đơn giản như:

hg qpop some-feature 
hg qpush fix-bug-1234 
# wrap up bug fix 
hg qfinish fix-bug-1234 
# get back to work on feature 

Tuy nhiên, MQ dường như luôn luôn sử dụng các bản vá mới nhất được tạo ra trong series, và áp dụng nó không phụ thuộc vào lệnh qpop/qpush Tôi đang sử dụng. Tôi nên lưu ý rằng các tập tin tôi làm việc trên là hoàn toàn riêng biệt là tốt (mặc dù đôi khi họ có thể giống nhau).

Tôi có thiếu gì đó ở đây không? Tôi có nên sử dụng hg qqueue cho việc này không? Cảm ơn.

Trả lời

10

Bạn có thể sử dụng guards. Chúng cho phép bạn duy trì thứ tự các bản vá mà không cần sắp xếp lại tệp series của bạn và chỉ áp dụng có chọn lọc một tập hợp các bản vá lỗi, vẫn còn theo kiểu xếp theo thứ tự được sắp xếp theo thứ tự.

Một ví dụ trong trường hợp của bạn sẽ là:

hg qnew bugfix 
# ..hack hack.. 
hg qrefresh 
# want to switch over to working on some feature now 
hg qpop 
hg qnew feature 
# ..hack hack.. 
hg qrefresh 

Tại thời điểm này, bạn đang ở trong một tình huống mà bản vá feature đến trước bugfix trong ngăn xếp của bạn.Bây giờ bạn có thể sử dụng vệ sĩ để chọn một hay khác, và chuyển đổi giữa hai:

hg qpop -a 
hg qguard feature +featureguard 
hg qguard bugfix +bugfixguard 

Nếu bạn muốn làm việc trên feature:

hg qselect featureguard 
hg qpush 
applying feature 
now at: feature 

Nếu bạn muốn làm việc trên bugfix:

hg qpop -a 
hg qselect bugfixguard 
hg qpush 
applying bugfix 
now at: bugfix 

Lưu ý rằng vì bạn đã chọn bảo vệ tích cực bugfixguard, MQ nhảy vọt qua feature (bởi vì nó là bảo vệ tích cực là khác nhau so với một lựa chọn) và áp dụng các miếng vá bugfix thay thế (mà đã phù hợp với bảo vệ được lựa chọn).

Một số công cụ hữu ích khi làm việc với bảo vệ là hg qseries -v, mà sẽ hiển thị một G thay vì thông thường U cho một bảo vệ, vá không được áp dụng, và hg qselect -l đó sẽ hiển thị các vệ sĩ đi kèm với mỗi bản vá.

4

Không, bạn không thiếu gì cả. Phần mở rộng mq thực hiện một giả định khá mạnh rằng hàng đợi vá là tuyến tính. Nếu bạn định tạo các bản vá/sửa lỗi đa năng thì qqueue sẽ hoạt động… Nhưng nếu các tính năng/bản sửa lỗi của bạn chỉ là các bản vá đơn và bạn muốn có thể áp dụng các bản vá lỗi đó, thì có thể dễ dàng hơn sắp xếp lại .hg/patches/series (lưu trữ thứ tự bản vá sẽ được áp dụng).

Tôi làm điều này (và tay chỉnh sửa các bản vá lỗi) đủ mà tôi đã có một bí danh shell:

alias viq='vim $(hg root)/.hg/patches/series' 

khác, nếu bạn không quan tâm áp dụng nhiều bản vá lỗi cùng một lúc, bạn có thể sử dụng qgoto:

$ hg qser 
0 U bug-1234 
1 U feature-4321 
$ hg qgoto feature-4321 
$ hg qser 
0 A bug-1234 
1 A feature-4321 
9
  1. Execute hg qpop -a để loại bỏ tất cả các bản vá lỗi từ stack
  2. Execute hg qpush --move some-patch để áp dụng "một số bản vá" mà không áp dụng bất kỳ bản vá nào khác có thể có trước bản vá trong ngăn xếp bản vá
Các vấn đề liên quan