có thể bỏ qua các quy tắc .gitignore trong thư mục con không?


82

Tôi muốn bỏ qua tất cả các quy tắc .gitignore trong thư mục con ngoại trừ các quy tắc .gitignore trong thư mục gốc.

ví dụ) Tôi đã có .gitignoretệp trong cấu trúc thư mục /a.

Và cũng có .gitignoretệp trong /a/b. Giả sử /aa.txt b.txttệp.

/a/b.configtệp. .gitignorexác định .configtrong /a/b.

.configtệp sẽ được bỏ qua bởi .gitignoretrong /a/b.

Nhưng tôi thực sự muốn theo dõi .configtệp bằng cách bỏ qua các quy tắc .gitignoretrong thư mục con.

Có khả thi không?

Cảm ơn trước

Câu trả lời:


134

Câu hỏi của bạn không quá rõ ràng, nhưng nếu có một số thư mục con mà bạn muốn các quy tắc gitignore khác nhau, bạn chỉ có thể tạo .gitignore mới trong thư mục đó.

Giả sử bạn có:

project / .gitignore
dự án / thứ / .gitignore

.Gitignore trong thứ / sẽ ghi đè .gitignore trong thư mục gốc.

git help gitignorehoặc man gitignorecó thêm một chút thông tin về những gì có thể.


2
Tôi nghĩ OP đang hỏi nếu bạn có cấu trúc thư mục /a/b/cvà bạn cập nhật .gitignorevào /a/b, liệu có thể /a/b/cbỏ qua các quy tắc trong /a/bvà thay vào đó chỉ sử dụng các quy tắc từ /a.
Michael Mior

45
Vâng, nếu đó là câu hỏi, có thể phủ định các quy tắc trong .gitignore sâu hơn trong chuỗi. "An optional prefix ! which negates the pattern; any matching file excluded by a previous pattern will become included again."
signine

3
@signine Không hoạt động với các thư mục. Hãy xem câu trả lời của tôi .
Ross Patterson

2
Tôi nghĩ chính xác hơn khi nói rằng: inner .gitignoresẽ hợp nhất với outer .gitignorecó mức độ ưu tiên cao hơn, không chỉ đơn giản là ghi đè.
Eric Wang

@eric wang rõ ràng là một thư mục con không hợp nhất, nhưng ghi đè: git-scm.com/docs/gitignore
topspin

39

Giả sử bạn muốn đưa node_modulesvào kho lưu trữ của mình, nhưng một số mô-đun dưới dòng có .gitignorecủa riêng nó. Bạn có thể phủ nhận các quy tắc bằng cách thêm phần sau vào .gitignoretệp gốc của mình :

# Make sure to include everything in node_modules.
!node_modules/**

3
Có cách nào chung chung hơn để làm điều này không? giả sử tôi đã có node_modules/mod1, node_modules/mod2bên trong cả hai đều là một .gitignore bỏ qua phần sâu hơn node_modulesbên trong chúng (như trong node_modules/mod1/node_modules. Tôi thêm và xóa các mô-đun thường xuyên nên tôi không thể biết rõ và thêm các quy tắc theo cách thủ công để bỏ qua node_modules/mod1/.gitignorehoặc thêm thủ công !node_modules/mod1/node_modulesmọi lúc. về cơ bản tôi đang cố gắng để triển khai một ứng dụng sao băng và tất cả các nhúng .gitignoresđang làm cho nó không thể làm cho nó tất cả trong git.
GMAN

10

Mấu chốt của vấn đề ở đây là một thư mục mẹ bị loại trừ. Từ $ man gitignore:

Không thể bao gồm lại tệp nếu thư mục mẹ của tệp đó bị loại trừ. Git không liệt kê các thư mục bị loại trừ vì lý do hiệu suất, vì vậy bất kỳ mẫu nào trên các tệp được chứa đều không có hiệu lực, bất kể chúng được xác định ở đâu.

Đây là cách tôi đã làm cho nó hoạt động. Được:

/a/...
/b/foo
/c/...

/.gitignore:

/*
!/b

Sau đó /b/foosẽ hiển thị dưới dạng tệp được bao gồm trong khi mọi thứ trong /a/csẽ bị loại trừ. Đánh đổi là bạn phải thêm phủ định cho tất cả các thư mục gốc của bất kỳ thư mục nào mà bạn muốn bao gồm các tệp.


Tại sao không sử dụng !/b/**/*?
Alexis Tyler

Không thể trả lời mà không có thêm lời giải thích từ bạn.
Ross Patterson

6

Theo như tôi biết không có cách nào để làm điều đó. Vì .gitignore cục bộ sẽ ghi đè lên ginignore gốc Cách giải quyết của tôi là thêm thủ công.

git add --force [ your file and folder]

con .gitignorekhông hoạt động với tôi vì cha mẹ ghi đè bất kỳ cài đặt thư mục con nào. Nếu bạn buộc thêm bằng cách sử dụng, git add -f myfile.txtnó sẽ bắt đầu theo dõi các thay đổi bỏ qua .gitignorecài đặt gốc .
SliverNinja - MSFT
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.