Bỏ qua một cách đệ quy tất cả các tệp trong một thư mục cụ thể ngoại trừ một loại tệp cụ thể


89

Tôi đã thấy các câu hỏi tương tự ( 1 , 23 ), nhưng tôi không nhận được giải pháp thích hợp từ chúng.

Tôi cần bỏ qua tất cả các tệp trong một thư mục cụ thể ngoại trừ một loại tệp cụ thể. Thư mục là một thư mục con cho đường dẫn gốc. Hãy để tôi đặt tên cho thư mục Resources. Vì tôi không muốn làm phức tạp mọi thứ, hãy để tôi bỏ qua các tệp trong tất cả các thư mục được đặt tên cho Resourcesdù nó ở đâu.

Đây là giải pháp phổ biến nhất (trong tất cả các câu hỏi trùng lặp)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

Vấn đề với giải pháp này là nó ngừng theo dõi các tệp mới được thêm vào (vì *bỏ qua tất cả các tệp). Tôi không muốn tiếp tục loại trừ từng loại tệp. Tôi muốn hành vi bình thường nếu bất kỳ tệp mới nào được thêm vào, hãy git statushiển thị nó.

Cuối cùng tôi đã có một giải pháp ở đây . Giải pháp là thêm một .gitignoretệp khác trong Resourcesthư mục. Điều này hoạt động chính xác.

Tôi có thể đạt được điều tương tự với một tệp bỏ qua không? Tôi thấy có nhiều tệp bỏ qua trong các thư mục khác nhau hơi rắc rối.

Đây là những gì tôi đang cố gắng đạt được:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

Nhưng điều này cho kết quả ngược lại. Nó bỏ qua *.foocác loại và theo dõi các tệp khác.

Câu trả lời:


108

@SimonBuchan là đúng.

Kể từ git 1.8.2, Resources/** !Resources/**/*.foohoạt động.


1
Điều này phù hợp với tôi, tinh chỉnh nhẹ, tôi chỉ cần xóa các thư mục và mọi thứ bên dưới chúng nên tôi đã làm: DirectoryName1/** DirectoryName1/**/*cho từng thư mục trong số chúng. Firs xóa thư mục nhưng bạn cần thứ hai để xóa tất cả các loại tệp.
Người say mê Scala

27

Câu trả lời tốt nhất là thêm tệp Tài nguyên / .gitignore trong Tài nguyên chứa:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

Nếu bạn không muốn hoặc không thể thêm tệp .gitignore đó, có một giải pháp không phù hợp:

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

Bạn sẽ cần phải chỉnh sửa mẫu đó nếu bạn thêm các thư mục sâu hơn chỉ định.


2
Thats buồn .. Trên thực tế tôi sẽ có thư mục sâu hơn, vì vậy tôi sẽ gắn bó với người đầu tiên :(
nawfal

Xem thêm chi tiết về giải pháp tương tự tại đây: stackoverflow.com/questions/7803689/… - cũng được liên kết ở trên bởi OP @nawfal
tại đây,

7

Điều này trông có vẻ ngu ngốc, nhưng hãy kiểm tra xem bạn có chưa thêm thư mục / tệp mà bạn đang cố gắng bỏ qua vào chỉ mục trước đó hay không. Nếu bạn đã làm như vậy, không có vấn đề gì bạn đặt trong tệp .gitignore của mình, các thư mục / tệp sẽ vẫn được sắp xếp.


5
Nếu ai đó gặp trường hợp sử dụng cụ thể này, bạn có thể sử dụng git rm --cached <path to files>để xóa các tệp bị bỏ qua đó khỏi git trong khi vẫn để chúng trong hệ thống tệp.
slothluvchunk

5

Hoặc tôi đang làm sai hoặc câu trả lời được chấp nhận không hoạt động nữa với git hiện tại.

Tôi thực sự đã tìm thấy giải pháp thích hợp và đăng nó dưới cùng một câu hỏi ở đây . Để biết thêm chi tiết, hãy đến đó.

Giải pháp:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo

2
Vâng, điều này làm việc cho tôi. Thêm vào !/Resources/**/là rất quan trọng để có git không bỏ qua các thư mục con.
Johnster
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.