Danh sách trắng và thư mục con trong Git


91

Tôi đã tạo một danh sách trắng chỉ dành cho các tệp văn bản.

*
!*.txt

Bây giờ, tôi có một tệp văn bản chưa được theo dõi trong một thư mục con - sub/dir/file.txtvà điều này KHÔNG được hiển thị (nó bị bỏ qua). Tuy nhiên, các tệp văn bản trong thư mục gốc được hiển thị.

Tại sao vậy, và làm cách nào để khắc phục?



Các tệp bạn muốn đưa vào thư mục con? Nếu vậy, thư mục con này có thể đã bị bỏ qua bởi dấu sao đầu tiên trong của bạn .gitignore.
fajran

Đúng. Các tệp này sẽ có cấu trúc thư mục thấp như thư mục 11.1.102.55 trong ví dụ của tôi. Việc lồng không phải lúc nào cũng giống nhau giữa các thư mục / sản phẩm.
Nate

1
Tôi biết về chức năng này. Chúng tôi có hàng trăm thư mục. Sẽ nhanh hơn nếu chỉ bỏ qua rõ ràng các kiểu tệp mà chúng ta không muốn hơn là tạo một gitignore cho mỗi thư mục. Tôi thực sự đang tìm cách để lấy chức năng danh sách trắng ra khỏi tệp .gitignore.
Nate

1
Tôi không thấy làm thế nào đây là một bản sao. Câu hỏi khác hỏi cách lập danh sách trắng các tệp nhất định, trong khi câu hỏi này hỏi cách lập danh sách trắng các loại tệp nhất định bao gồm các thư mục con. Trên thực tế, nó giống như một bản sao của stackoverflow.com/questions/8024924/… .
Big McLargeHuge

Câu trả lời:


146

Nếu bạn thử theo cách đó, nó sẽ thất bại, bởi vì bạn sẽ kết thúc danh sách đen các thư mục trong cấu trúc của mình.

Để giải quyết, bạn muốn đưa vào danh sách đen mọi thứ không phải là thư mục và không phải là một trong các loại tệp bạn muốn cam kết, trong khi không đưa vào danh sách đen các thư mục .

Các .gitignoretập tin đó sẽ làm điều này:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

Thử nghiệm điều này trong một cấu trúc ba mức trắng niêm yết cho .txttập tin trong sự hiện diện của *.one, *.two*.threecác file bằng cách sử dụng .gitignorenằm trong thư mục gốc của kho - công trình đối với tôi. Bạn sẽ không phải thêm .gitignoretệp vào tất cả các thư mục trong cấu trúc của mình.

Thông tin tôi sử dụng để tìm ra câu trả lời đến từ, trong số những thứ khác, điều này (stackoverflow.com).


18
Bạn cũng cần mục !.gitignorekhi sử dụng *, phải không?
sjas

2
Xem câu trả lời của tôi tại đây: stackoverflow.com/questions/987142/… Có thể hữu ích hơn khi sử dụng /*để chỉ danh sách đen thư mục cấp cao nhất, nhưng không phải tất cả các thư mục một cách đệ quy, điều đó thực sự có nghĩa là .gitignorekhông nên xem xét các thư mục con của thư mục trong danh sách trắng.
Ryan Taylor

2

Một cách đơn giản hơn để đạt được điều này là:

# Blacklist all files...
*.*

# ...except the ones we want
!*.txt

Điều này hoạt động vì gitignoreáp dụng các mẫu không bắt đầu với /mọi cấp bên dưới .gitignoretệp:

Nếu có dấu phân tách ở đầu hoặc giữa (hoặc cả hai) của mẫu, thì mẫu đó có liên quan đến cấp thư mục của chính tệp .gitignore cụ thể. Nếu không, mẫu cũng có thể khớp ở bất kỳ mức nào dưới mức .gitignore.

Nếu bạn muốn thực hiện việc này với các tệp bên trong một thư mục , mọi thứ trở nên phức tạp hơn:

# Blacklist all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

Điều này hoạt động vì gitignorecó các quy tắc đặc biệt cho **:

Hai dấu sao liên tiếp (" **") trong các mẫu khớp với tên đường dẫn đầy đủ có thể có ý nghĩa đặc biệt:

  • Dấu gạch chéo được theo sau bởi hai dấu hoa thị liên tiếp, sau đó dấu gạch chéo khớp với không hoặc nhiều thư mục. Ví dụ: " a/**/b" đối sánh " a/b", " a/x/b", " a/x/y/b", v.v.

Mấu chốt quan trọng là đảm bảo bạn không bỏ qua các thư mục, vì sau đó mọi tệp trong thư mục đó đều bị bỏ qua bất kể các quy tắc khác.


0

Tôi đã tìm kiếm rất lâu:

  1. Giả sử tôi có một cấu trúc thư mục lớn với ~ 100.000 thư mục được lồng vào nhau một cách đệ quy. Trong các thư mục đó, có khoảng 30.000 tệp các loại .txt(trong trường hợp của tôi: loại *.md). Bên cạnh những *.mdtệp này , giả sử có 500GB trong số (một triệu +) tệp mà tôi không muốn theo dõi.

  2. Tôi muốn git chỉ theo dõi .txt(hoặc *.md) các tệp trong tất cả các thư mục và thứ tự con.

Câu trả lời đúng phải là: điều này không thể thực hiện được trong Git.

Những gì tôi đã làm thay vào đó:

[sửa: cũng không hoạt động - Tôi đã cố gắng tạo một thư mục với các liên kết tượng trưng (hoặc liên kết cứng) và sử dụng git ở đó, nhưng git không tuân theo các liên kết tượng trưng và ghi đè lên các liên kết cứng. Doh!]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.