2012-03-09 26 views
5

Sử dụng Mercurial, làm thế nào tôi có thể gói tất cả các thay đổi không được biết đến trong một kho lưu trữ khác, bao gồm các thay đổi bí mật?Mercurial: Bao gồm các thay đổi bí mật trong gói?

Tôi biết tùy chọn bundle 's --base xảy ra bao gồm các thay đổi bí mật, nhưng tôi không muốn hành vi --base. (Và có vẻ như kỳ lạ khác thường mà changesets bí mật là luôn kèm --base nhưng bao giờ bao gồm mà không có nó. Nên không có được một lựa chọn riêng biệt?)

FYI, tôi thường muốn thực hiện một bản sao lưu của tất cả changesets chỉ trong repo địa phương của tôi trước khi cố gắng viết lại lịch sử nguy hiểm tiềm ẩn.

+0

Có thể chỉ ** không viết lại ** lịch sử? –

+0

'hg help phase '- các thay đổi bí mật không được đẩy, kéo hoặc nhân bản –

Trả lời

5

Bạn đúng là hg bundle thường sẽ loại trừ các thay đổi bí mật. Điều này là bởi vì nó chỉ chạy tương đương với hg outgoing và gói các thay đổi này.

Vì vậy, một số công việc ở quanh:

  • Nếu bạn biết rằng bạn có ít nhất một dự thảo hoặc changeset đi công cộng như tổ tiên của changesets bí mật của bạn, sau đó bạn có thể sử dụng

    $ hg bundle --base "parents(outgoing())" 
    

    để có được những gì bạn muốn. Việc sửa đổi outgoing() sẽ chọn bản nháp và các thay đổi công khai còn thiếu và parents(outgoing() sẽ là cơ sở phù hợp. Vì bạn sử dụng --base bạn sẽ có được tất cả các hậu duệ (công khai, dự thảo và bí mật) từ các cơ sở này.

  • Bạn có thể tạm thời làm cho dự thảo changesets bí mật của bạn, bó, và sau đó đánh dấu chúng bí mật nữa:

    $ secret=$(hg log --template "{rev} " -r "secret()"); \ 
        hg phase -d $secret; \ 
        hg bundle out.hg; \ 
        hg phase -f -s $secret 
    

    (tôi sử dụng Zsh và ở đó tôi đã phải sử dụng ${=secret} thay vì $secret vì Zsh không làm từ chia tách trên tham số mở rộng theo mặc định.)

    Điều quan trọng là phải chuỗi các lệnh bằng ; thay vì && vì bạn sẽ muốn đặt lại các giai đoạn bất kể điều gì xảy ra trong cuộc gọi hg bundle. ters to hg bundle không có nghĩa là bạn mất tất cả thông tin về các thay đổi bí mật. Cũng lưu ý rằng kể từ khi changesets bí mật chỉ có con cháu bí mật, không có mất thông tin với kỹ thuật này.

    Bạn có thể tắt chức năng này thành một bí danh shell:

    [alias] 
    bundle-all = !secret=$(hg log --template "{rev} " -r "secret()"); 
          hg phase -d $secret; 
          hg bundle [email protected]; 
          hg phase -f -s $secret 
    

    Các [email protected] được mở rộng bởi Mercurial trước bí danh được gọi và điều này cho phép bạn chèn các đối số cần thiết cho hg bundle.

Lưu ý rằng thông tin pha không thể được lưu trữ trong gói - định dạng gói chưa được thay đổi để phù hợp với nó.

1

Nếu bạn biết có ít nhất một changeset công cộng, bạn có thể sử dụng này:

hg bundle -r "not public()" --base public() 

OTOH, rằng sẽ không hoạt động nếu không có changesets công cộng, sử dụng này để thay thế:

hg bundle -r "not public()" --base null 

Vấn đề với câu trả lời của Martin là nó dựa vào việc gửi đi, từ đó dựa trên một kết nối trực tiếp tới repo đẩy. Nếu bạn không phải lúc nào cũng có kết nối internet với repo đó, các phương pháp này hoạt động tốt cho tôi. Nó cũng hơi đơn giản hơn giai đoạn nhảy.

Một thử nghiệm cho dù có bất kỳ changesets công cộng là để bắt đầu ra của:

hg log -r public() -l 1 --template "{rev}" 

và kiểm tra chiều dài của nó, hoặc sự hiện diện của [0-9].

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