2010-09-03 38 views
13

Tôi đang quản lý $ HOME bằng Mercurial, để giữ cho các dấu chấm của tôi đẹp và được theo dõi, hoặc ít nhất là những thứ quan trọng với tôi.Làm cách nào để bỏ qua tất cả các thư mục ngoại trừ một thư mục sử dụng .hgignore?

Tuy nhiên, có rất nhiều tệp và thư mục trong ~ không cần phải theo dõi và tập hợp đó luôn thay đổi và phát triển.

Về mặt lịch sử, tôi đã giải quyết điều này bằng cách .hgignore này:

syntax: glob 
* 

Điều này sẽ giúp tình trạng của tôi sạch sẽ, như xa như nó đi, làm cho chỉ trước các file có thể nhìn thấy được theo dõi. Tuy nhiên, tôi có một số thư mục (trong trường hợp của tôi, scripts, .emacs.d) mà tôi muốn xem các tập tin không được theo dõi trong; Tôi gần như luôn luôn muốn theo dõi các bổ sung mới cho những thư mục đó.

Tôi biết rằng tôi có thể chạy hg st -u scripts để xác định các tệp không được theo dõi, nhưng tôi muốn phương tiện theo đó tôi có thể đạt được cùng chức năng sử dụng trạng thái ole hg thuần túy.

Có cách nào để thực hiện việc này không?

Trả lời

17

Hãy thử điều này trong .hgignore thay vì:

syntax: regexp 

^(?!(scripts|foo|bar)/)[^/]+/ 
  • ^ trận đấu bắt đầu của con đường
  • (?!(scripts|foo|bar) sử dụng lookahead tiêu cực để bỏ qua tất cả các file ngoại trừ những người trong danh bạ scripts, foo hoặc bar
  • /) đảm bảo rằng các thư mục có thư mục được theo dõi dưới dạng tiền tố được bỏ qua
  • [^/]+/ sau đó thực sự phù hợp với bất kỳ thư mục (trừ loại trừ khả năng do lookahead), để các file trong ~ không được bỏ qua

tín dụng cho ý tưởng trung tâm trong giải pháp này (lookahead âm) đi vào Michael La Câu trả lời của Voie gửi đến this question

+0

Đây là giải pháp tối đa, nhưng tất cả các tệp trong ~ vẫn được hiển thị, tại _least_ là nhiễu. Tôi không theo dõi tất cả các dotfile (không ít nhất trong số đó bởi vì rất nhiều gói nhấn mạnh vào thả chúng trong thư mục ~ của tôi). –

+1

Trừ khi bạn có thể sử dụng các mẫu tên tập tin để phân biệt các dấu chấm (để bỏ qua) từ các thư mục (không bị bỏ qua), tôi nghĩ bạn không may mắn. Tài liệu Mercurial nói rằng nếu một đường dẫn 'a/b/c' không khớp với mẫu' .ggignore', cùng một mẫu được thử với cả 'a/b' và nếu thất bại,' a'. Vì vậy, các tệp và thư mục trong thư mục gốc chỉ có thể được phân biệt theo cách chúng được viết. Nếu chỉ một vài thư mục được theo dõi bắt đầu bằng một dấu chấm, thì bạn có thể thêm thủ công những thứ đó và '.ggignore' mọi thứ khác bắt đầu bằng một dấu chấm. – shambulator

8

Câu hỏi này đã được hỏi ở đây một vài lần và bạn sẽ nhận được rất nhiều câu trả lời phức tạp bằng cách sử dụng xác nhận không có chiều rộng tiêu cực phía trước, một thủ thuật regex bị lạm dụng, nhưng các giải pháp tốt hơn hoặc là (a) chỉ cần thực hiện repo trong thư mục đó hoặc (b) chỉ cần thêm các tệp trong thư mục đó. Đối với tùy chọn (b) bạn chỉ cần đặt .* trong tệp .hgignore của mình để bỏ qua mọi thứ và sau đó theo cách thủ công hg add các tệp bạn muốn theo dõi. Trong mercurial, không giống như svn và cvs, bạn có thể ghi đè lên một bỏ qua với một add.

+0

Tạo repo trong thư mục đó không theo dõi các tệp trong thư mục gốc hoặc để mở tùy chọn theo dõi các thư mục khác trong cùng một kho lưu trữ.Có gì sai khi sử dụng lookahead? – shambulator

+0

Không có gì sai, nó chỉ phức tạp và ít khi được thực hiện. Chủ yếu là folks chỉ 'hg thêm' các trường hợp ngoại lệ và bỏ qua tất cả mọi thứ nếu họ muốn .hgignore là một danh sách trắng thay vì danh sách đen mà nó được. –

+0

Đủ công bằng - Tôi sẽ không phủ nhận mất một vài lần để có được quyền regex, và đó là giả định tôi đã không bỏ lỡ một số trường hợp góc :) Mỗi ​​một trong những bạn nhận được quyền giúp bạn với một trong những kế tiếp, mặc dù! Và theo cách này, bạn chỉ cần sử dụng 'hg status' và' hg addremove'. – shambulator

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