2012-01-31 21 views
6

Tôi mới tham gia DVCS vì vậy có lẽ tôi hiểu nhầm một số khái niệm và thuật ngữ, nhưng đây là ý tưởng về những gì tôi đang cố gắng đạt được cố gắng tìm hiểu xem một trong hai Bazaar hoặc Mercurial có hỗ trợ điều này một cách đơn giản:Tránh đẩy lịch sử cục bộ không mong muốn vào kho chính trong Bazaar hoặc Mercurial

Có kho lưu trữ chính với mã được kiểm tra kỹ lưỡng. Nói rằng tôi sao chép (hoặc kéo hoặc chi nhánh hoặc bất kỳ thuật ngữ nào) từ đó vào một kho lưu trữ cục bộ, sau đó mỗi ngày khi tôi làm việc trên mã, tôi cam kết thay đổi cục bộ, đôi khi nhiều lần trong ngày.

Sau khi tôi đang thực hiện với tất cả thay đổi và thử nghiệm của tôi, tôi muốn nhận được chỉ (địa phương) phiên bản mới nhất cam kết của tất cả các tập tin đưa vào kho lưu trữ chính, mà không hàng chục phiên bản trung gian mà tôi cam kết tại địa phương trong gỡ lỗi và thử nghiệm đơn vị.

Từ những gì tôi đã đọc, rõ ràng toàn bộ lịch sử của các phiên bản nửa nướng này sẽ được phản ánh trong kho lưu trữ chính nếu tôi ấn vào nó. Một số bài viết trên internet dường như gợi ý rằng việc rebase có thể giải quyết vấn đề đó nếu nó được xử lý đúng, nhưng nó không rõ ràng nếu/làm thế nào có thể được thực hiện, vì nó có vẻ như rebase là nhiều hơn để tránh một nhánh nhánh/hợp nhất phân nhánh hơn để tránh cam kết của một tập hợp lớn các phiên bản trung gian.

Trả lời

5

Một số tùy chọn chợ.

  1. Nếu bạn muốn loại bỏ hàng chục cam kết cục bộ, bạn thực sự đang vứt bỏ lịch sử. Một cách để thực hiện nó là với lệnh bzr uncommit. ví dụ.

    bzr uncommit -rbranch:https://url_to_mainrepo 
    

    (Vứt bỏ rivisions cho đến khi bạn nhận được để việc rà soát các repo chính. Đừng lo lắng nó sẽ hiển thị cho bạn những gì sẽ được thực hiện và xác nhận với bạn trước khi làm việc đó)

    Sau đó, bạn có thể làm một cam kết mới với tất cả những người khác sụp đổ thành một.

  2. Bazaar thường ẩn các bản sửa đổi đã hợp nhất. Một cách để bạn cuộn lên các cam kết nhỏ của bạn thành một bản sửa đổi sáp nhập là giữ một nhánh/thanh toán cục bộ của repo chính. Sau đó, khi bạn đã sẵn sàng, bzr merge trong các thay đổi của bạn vào bản sao repo chính cục bộ của bạn và sau đó cam kết một bản sửa đổi đã hợp nhất.

    Bằng cách này bạn vẫn giữ tất cả lịch sử của mình nhưng tất cả các bản sửa đổi nhỏ được sắp xếp gọn gàng vào bản sửa đổi hợp nhất. Bạn vẫn có thể thấy lịch sử đó khi bạn muốn.

Dưới đây là ví dụ về làm thế nào để không thấy sửa đổi sáp nhập:

$ bzr log 
------------------------------------------------------------ 
revno: 2 [merge] 
message: 
    summary of the things I did 
------------------------------------------------------------ 
revno: 1 
message: 
    some change on the mainline 
------------------------------------------------------------ 
Use --include-merged or -n0 to see merged revisions. 

Dưới đây là ví dụ về cách để xem các phiên bản sáp nhập:

$ bzr log -n0 
------------------------------------------------------------ 
revno: 2 [merge] 
message: 
    summary of the things I did 
    ------------------------------------------------------------ 
    revno: 1.1.2 
    message: 
     my first step 
    ------------------------------------------------------------ 
    revno: 1.1.1 
    message: 
     my second step 
------------------------------------------------------------ 
revno: 1 
message: 
    some change on the mainline 
+0

Bạn nói rằng nó "thường" bị ẩn nên có nghĩa là không phải lúc nào cũng bị ẩn? ... với tùy chọn 2, sau khi hợp nhất và cam kết với kho chính được thực hiện, nội dung tệp của các phiên bản trung gian được cam kết cục bộ trước khi hợp nhất có thể truy cập được trong repo chính thông qua các phương tiện gián tiếp (ví dụ: tệp nhật ký) không? – Gigatron

+0

thêm ví dụ về cách xem hoặc không nhìn thấy các bản sửa đổi đã hợp nhất – AmanicA

+0

OK, vì vậy, các nhận xét và siêu dữ liệu có thể được nhìn thấy trong nhật ký, nhưng dữ liệu tệp thực tế của các phiên bản được đăng ký cục bộ nửa nướng sẽ không hiển thị trong chính repo, đúng không? – Gigatron

5

Các từ khóa mà bạn đang tìm kiếm là sụp đổ hoặc lần (Mercurial) hoặc (Git). Tôi sợ tôi không biết thuật ngữ thông thường là gì ở Bazaar.

Trong Mercurial bạn có thể sử dụng histedit extension (một phần mở rộng đi kèm kể từ Mercurial 2.3) để gấp một loạt các thay đổi thành một changeset duy nhất. Nó cung cấp một superset của các chức năng trong bên thứ ba collapse extension.

rebase extension (một tiện ích mở rộng chuẩn khác) có cùng chức năng với cờ --collapse. Bạn hoàn toàn đúng rằng việc rebasing thường được thực hiện để tránh những hợp nhất không cần thiết, nhưng bằng cách nào đó nó cũng đã được sử dụng cho collapsing (and editing) changesets in Git. Các histedit extension cho Mercurial được mô hình hóa sau khi commmand rebase tương tác trong Git.

+0

Rất tiếc, nhiều tiện ích chỉnh sửa lịch sử Mercurial gặp sự cố nếu bạn đã thực hiện những việc như hợp nhất từ ​​đường chính vào nhánh của bạn trên đường đi. –

+0

Thật không may là tốt, gấp thay đổi trong Mercurial với 'hg histedit' hoặc' hg collapse' mất thông tin về đổi tên tệp và do đó lịch sử chỉnh sửa của tệp được đổi tên. (Nó xuất hiện như một tập tin mới với toàn bộ nội dung như vừa được thêm vào). – Iodnas

+0

@ lodnas: Tôi không thể tạo lại điều này với 'hg histedit' - vui lòng gửi báo cáo lỗi kèm hướng dẫn về cách kích hoạt: http://bz.selenic.com/ (Tôi chưa thử nghiệm sự cố theo cùng một cách, đó là phần mở rộng của bên thứ ba và có thể bị lỗi nhiều hơn so với phần mở rộng mô tả chuẩn hiện nay). –

1

Trong Bazaar, điều này được xử lý bằng cách một "bản sao" riêng biệt (tức là bzr branch URL) của repo chính tại địa phương và sau đó bạn tạo các chi nhánh tính năng cục bộ từ đó bạn thực hiện công việc của mình với nhiều lần commit. Khi bạn đã sẵn sàng chuyển công việc đó vào repo chính, bạn bzr merge nhánh tính năng vào nhánh chính. Điều đó để lại cho bạn một cây làm việc được sửa đổi trong nhánh chính mà bạn sau đó cam kết và đẩy đến repo chính thức của bạn. Cam kết này bao gồm lịch sử sửa đổi từ chi nhánh tính năng của bạn nhưng nó thường bị ẩn trong bzr log hoặc các chế độ xem lịch sử nhật ký khác.

+0

Bạn có thể thực hiện điều tương tự với các nhánh được đặt tên, mà không cần phải có thêm bản sao của ít nhất trong Mercurial, và tôi tin git. (Cũng trong CVS và SVN, nhưng đó không phải là những gì bạn hỏi.) Bạn chỉ cần huấn luyện những người dùng khác làm "hg log -b default", để họ chỉ nhìn vào lịch sử của chi nhánh chính chứ không phải chi nhánh nhiệm vụ với tất cả các checkins trung gian của bạn. –

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