5 Câu hỏi: Làm thế nào để quy tắc loại trừ .gitignore thực sự hoạt động?

câu hỏi được tạo ra tại Mon, Jul 1, 2019 12:00 AM

Tôi đang cố gắng giải quyết vấn đề gitignore trên cấu trúc thư mục lớn, nhưng để đơn giản hóa câu hỏi của mình, tôi đã giảm nó xuống như sau.

Tôi có cấu trúc thư mục sau gồm hai tệp (foo, bar) trong kho lưu trữ git hoàn toàn mới (cho đến nay không có cam kết):

 49 310

Rõ ràng, một 'trạng thái git -u' hiển thị:

 49 310

Điều tôi muốn làm là tạo tệp .gitignore bỏ qua mọi thứ bên trong a /b /c nhưng không bỏ qua tệp 'foo'.

Nếu tôi tạo một .gitignore như vậy:

 49 310

Sau đó, 'trạng thái git -u' hiển thị cả foo và thanh như bị bỏ qua:

 49 310

Đúng như tôi mong đợi.

Bây giờ nếu tôi thêm quy tắc loại trừ cho foo, do đó:

 49 310

Theo trang web của gitignore, tôi hy vọng điều này sẽ hoạt động. Nhưng nó không - nó vẫn bỏ qua foo:

 49 310

Điều này cũng không hoạt động:

 49 310

Không làm điều này:

 49 310

Cung cấp:

 49 310

Trong trường hợp đó, mặc dù foo không còn bị bỏ qua, thanh cũng không bị bỏ qua.

Thứ tự của các quy tắc trong .gitignore dường như cũng không quan trọng.

Điều này cũng không làm những gì tôi mong đợi:

 49 310

Cái đó bỏ qua cả foo và bar.

Một tình huống hoạt động là nếu tôi tạo tệp a /b /c /.gitignore và đặt vào đó:

 49 310

Nhưng vấn đề với điều này là cuối cùng sẽ có các thư mục con khác theo a /b /c và tôi không muốn phải đặt một .gitignore riêng cho mỗi một - tôi đã hy vọng tạo ra 'dựa trên dự án '.gitignore tệp có thể nằm trong thư mục trên cùng của mỗi dự án và bao gồm tất cả cấu trúc thư mục con' tiêu chuẩn '.

Điều này cũng có vẻ tương đương:

 49 310

Đây có thể là điều gần nhất để "làm việc" mà tôi có thể đạt được, nhưng các đường dẫn tương đối đầy đủ và các ngoại lệ rõ ràng cần được nêu rõ, sẽ là một nỗi đau nếu tôi có nhiều tệp tên 'foo' ở các cấp khác nhau của cây thư mục con.

Dù sao, tôi cũng không hiểu các quy tắc loại trừ hoạt động như thế nào hoặc chúng hoàn toàn không hoạt động khi các thư mục (chứ không phải ký tự đại diện) bị bỏ qua - bởi một quy tắc kết thúc bằng /

Bất cứ ai cũng có thể làm sáng tỏ về điều này?

Có cách nào để khiến gitignore sử dụng thứ gì đó hợp lý như biểu thức thông thường thay vì cú pháp dựa trên vỏ vụng về này không?

Tôi đang sử dụng và quan sát điều này với git-1.6.6.1 trên Cygwin /bash3 và git-1.7.1 trên Ubuntu /bash3.

    
139
  1. stackoverflow.com/questions/2820255/,
    2010-06-09 03: 37: 50Z
  2. Câu hỏi được viết hoàn hảo! Số lượng các trường hợp bạn đã cố gắng thực sự giúp tôi hiểu những gì tôi đã làm sai trong trường hợp tương tự của tôi. Cảm ơn chúa, hôm nay tôi đã tìm kiếm rất lâu.
    2018-11-18 23: 45: 06Z
5 Câu trả lời                              5                         
 49 310

Có vẻ hoạt động với tôi (git 1.7.0.4 trên Linux). 49 310 rất quan trọng vì nếu không bạn sẽ bỏ qua chính thư mục (vì vậy git sẽ không nhìn vào bên trong) thay vì các tệp trong thư mục (cho phép loại trừ).

  

Một tiền tố tùy chọn! trong đó phủ nhận mô hình; mọi tệp phù hợp được loại trừ bởi mẫu trước đó sẽ được đưa vào lại.

i.e., tệp phải được loại trừ đã được đưa vào lại. Hy vọng rằng sẽ làm sáng tỏ.

    
141
2010-06-08 23: 00: 44Z
  1. Có, ví dụ bạn đưa ra cũng hoạt động tốt với tôi. Vấn đề là /a /b /* không hoạt động nếu foo is trong c, có nghĩa là nếu tôi có nhiều tệp foo trong các thư mục con khác nhau trong c (ví dụ: d /, e /, f /g /h /, i /j /, v.v.) thì quy tắc phủ định '! foo' sẽ không bắt những cái đó.
    2010-06-08 23: 29: 53Z
  2. @ meowsqueak Quả thực là không. Nếu bạn bỏ qua /a /b /* thì sẽ không có thư mục nào cho foo ở! Nếu bạn đang cố gắng bỏ qua toàn bộ cây thư mục bên dưới /a /b nhưng bao gồm bất kỳ tệp nào có tên "foo" có thể ở bất kỳ đâu trên cây, tôi không nghĩ rằng nó có thể thực hiện được với các mẫu .gitignore: \
    2010-06-08 23: 37: 18Z
  3. Trên thực tế điều này có thể giải thích tại sao điều này không hiệu quả với tôi - các quy tắc sau không hoạt động: "/a /b /*", "! c /foo" . Nếu điều đó có hiệu quả, có thể không có vấn đề gì.
    2010-06-08 23: 37: 19Z
  4. "Tôi không nghĩ rằng nó có thể thực hiện được với các mẫu .gitignore" - Thật không may, tôi nghĩ rằng bạn đúng, thật không may.
    2010-06-08 23: 38: 20Z
  5. @ meowsqueak Bạn có thể bỏ qua 49 310 và sau đó viết một hook cho 49 310 bất kỳ tệp nào phù hợp trước khi cam kết hoặc một cái gì đó
    2010-06-08 23: 42: 36Z

Tôi có một tình huống tương tự, giải pháp của tôi là sử dụng:

 49 310

Điều đó sẽ hoạt động với số lượng thư mục trung gian tùy ý nếu tôi đọc đúng 49 310.

    
24
2012/03/07 16: 11: 18Z

Đây là một tùy chọn khác:

 49 310

Điều đó sẽ bỏ qua mọi tệp và thư mục, ngoại trừ tệp /thư mục ba cấp độ sâu trong a.

    
6
2011 /02-06 00: 18: 27Z

điều này chắc chắn không rõ ràng từ trang người đàn ông .gitignore. Điều này hoạt động:

 49 310

Như Chris đã đề cập, một thư mục thậm chí không được mở nếu bị loại trừ. Vì vậy, nếu bạn muốn có thể bỏ qua * nhưng một số tệp, bạn phải xây dựng đường dẫn đến các tệp đó như trên. Đối với tôi điều này thật tiện lợi, vì tôi muốn thực hiện đánh giá mã trên 1 tệp của thư viện và nếu tôi muốn làm khác sau tôi chỉ cần thêm nó và tất cả những thứ khác đều bị bỏ qua.

    
4
2010-11-10 00: 42: 39Z

Trên một ghi chú chung hơn, git1.8.2 sẽ bao gồm patch (cũng trong v4 , được nhắc bởi một số câu hỏi về Stack Overflow ) từ Adam Spiers về việc xác định quy tắc 49 310 nào thực sự bỏ qua tập tin của bạn.

Xem ghi chú phát hành git1.8.2 và câu hỏi SO " quy tắc gitignore nào đang bỏ qua tệp của tôi ":
đó sẽ là lệnh 49 310 .

    
4
2017-05-23 12: 10: 30Z
  1. Cảm ơn bạn đã phát thông tin này.
    a/b/c/foo
    a/b/c/bar
    
    cũng sẽ cho bạn biết quy tắc nào ngăn tệp của bạn bị bỏ qua, nếu đó là trường hợp.
    2013-03-09 19: 37: 57Z
  2. @ AdamSpiers nghe thật tuyệt. Tôi chắc chắn sẽ phải chơi với nó.
    2013-03-09 19: 50: 40Z
# Untracked files:
...
#       a/b/c/bar
#       a/b/c/foo
nguồn đặt đây