2010-03-09 36 views
99

Tôi đang cố gắng chỉ cam kết một số tệp nhất định với Mercurial. Vì hg có tự động thêm bất cứ khi nào tôi cố gắng cam kết thay đổi, nó muốn cam kết tất cả các tệp. Nhưng tôi không muốn điều đó vì một số tập tin chưa sẵn sàng.Mercurial (hg) chỉ cam kết một số tệp nhất định

hg commit -I thefile.foo 

nhưng điều này chỉ dành cho một tập tin. Cách tốt hơn cho tôi là nếu tôi có thể tắt tự động thêm như trong Git. Điều này có thể không?

+5

sử dụng tiện ích mở rộng bản ghi? hoặc bạn có thể chỉ định tệp trên dòng lệnh 'hg ci foo bar baz' – tonfa

+3

@tonfa, đăng lại nhận xét của bạn dưới dạng câu trả lời – develop7

+0

Vui lòng không phá hoại bài đăng của bạn. – Glorfindel

Trả lời

133

Bạn có thể chỉ định các tập tin trên dòng lệnh, như tonfa viết:

$ hg commit foo.c foo.h dir/ 

Đó chỉ hoạt động và đó là những gì tôi làm tất cả các thời gian. Bạn cũng có thể sử dụng --include cờ mà bạn đã tìm thấy, và bạn có thể sử dụng nó nhiều lần như thế này:

$ hg commit -I foo.c -I "**/*.h" 

Bạn thậm chí có thể sử dụng một fileset để chọn các tập tin bạn muốn cam kết:

$ hg commit "set:size(1k - 1MB) and not binary()" 

Không có cài đặt nào sẽ tắt hành vi tự động thêm và thực hiện công việc Mercurial như Git. Tuy nhiên, mq extension có thể được quan tâm. Đó là một phần mở rộng tiên tiến, nhưng nó cho phép bạn làm gì để

$ hg qnew feature-x  # create new patch 
$ hg qrefresh -s foo.c # add a file to the current patch 
$ hg qrefresh -s bar.c # add another file to the patch 
$ hg qfinish -a   # convert applied patches to normal changesets 

tôi không thực sự sử dụng MQ cho mục đích này bản thân mình, tuy nhiên, kể từ khi tôi nghĩ rằng nó là đủ để chỉ cần chỉ định tên tập tin trên dòng lệnh.

0

Như được đề xuất trong this Stack Overflow question, cách đơn giản nhất để thực hiện việc này là với hg shelve.

+1

Làm thế nào để giúp đỡ cho việc này? Tôi hiểu nếu bạn tạm dừng chuyển nhánh hoặc bất kỳ điều gì phàn nàn về các thay đổi chưa thanh toán nhưng đối với cam kết chọn lọc, bạn chỉ cần chọn những gì bạn cần cam kết. – amertkara

+0

Chắc chắn không phải là ** cách đơn giản nhất **, nhưng hoạt động. Nó tương tự như 'git stash': loại bỏ bất cứ điều gì bạn muốn từ thư mục làm việc hiện tại của bạn, cho phép bạn chỉ cam kết những gì còn lại. – marcelocra

20

Nếu bạn muốn cam kết một vài tệp và loại trừ nhiều tệp khác, hãy liệt kê rõ ràng các tệp bạn muốn cam kết. -I chỉ cần thiết nếu bạn muốn sử dụng các mẫu thay vì tệp.

Nếu bạn muốn cam kết nhiều tệp và loại trừ chỉ một vài tệp, sử dụng -X thuận tiện hơn.

Ví dụ: cung cấp một kho chứa "file_1", "file_2" và "file_3", sau đây là tương đương, nhưng sau này sẽ dễ dàng hơn/nhanh hơn để gõ:

hg commit file_1 file_2 
hg commit -X file_3 
1

Tính đến 3,8 bạn cũng có thể sử dụng hg commit --interactive để chọn các tập tin (trước 3.8 bạn có thể sử dụng crecord extension để có chức năng tương tự). Cờ --interactive (hoặc chỉ -i) sẽ khiến hg nhắc bạn về các tệp bạn muốn đưa vào trong cam kết. Là một phần thưởng thêm, bạn thậm chí có thể bao gồm/loại trừ các khối trong các tệp.

Dưới đây là ví dụ về giao diện trông như thế nào. Lưu ý đây là một ảnh chụp màn hình cũ (của crecord thực sự) vì vậy giao diện đã thay đổi một chút (nhưng cơ bản là như nhau). crecord screenshot

Lưu ý để có giao diện mà bạn cần giao diện curses được bật.Bạn có thể thực hiện điều đó cho một lần chạy với hg commit --config ui.interface=curses --interactive hoặc thông thường bằng cách thêm thông tin sau vào .hgrc:

[ui] 
interface = curses 
Các vấn đề liên quan