Git bỏ qua các thư mục con


437

Tôi có rất nhiều dự án trong giải pháp .Net của tôi. Tôi muốn loại trừ tất cả các thư mục "bin / Debug" và "bin / Release" (và nội dung của chúng), nhưng vẫn bao gồm chính thư mục "bin" và bất kỳ dll nào có trong đó.

.gitignore với các thư mục "bin /" bỏ qua các thư mục "Gỡ lỗi" và "Phát hành", nhưng cũng có bất kỳ dll nào có trong thư mục "bin".

"bin / Debug" hoặc "bin / Release" trong tệp .gitignore không loại trừ các thư mục, trừ khi tôi hoàn toàn đủ điều kiện mẫu bỏ qua là "Giải pháp / Dự án / bin / Gỡ lỗi" - mà tôi không muốn làm như tôi sẽ cần bao gồm mẫu đầy đủ này cho từng dự án trong giải pháp của tôi, cũng như thêm nó cho bất kỳ dự án mới nào được thêm vào.

Bất kỳ đề xuất?


Tại sao thêm DLL? Nếu bạn đang tham khảo các DLL của bên thứ ba, có thể có ý nghĩa khi thêm một thư mục chung mà tất cả các dự án của bạn sau đó tham chiếu.
Thóc

6
Paddy đúng - nếu đó là các DLL của bên thứ ba, có lẽ chúng nên được tổ chức cách xa mã của bạn. Đối với tôi, mặc dù, có vẻ như bạn đang kiểm tra các sản phẩm xây dựng của riêng bạn, thường không phải là cách bạn muốn đi. Bạn sử dụng git để theo dõi thông tin , được chứa đầy đủ trong mã và cấu hình bản dựng. Các sản phẩm, tốt, sản phẩm. Theo dõi họ là yêu cầu sự cố - ví dụ, nếu bạn thay đổi mã mà quên xây dựng và kiểm tra sản phẩm mới thì sao?
Cascabel

Tôi đã có một vấn đề trong việc loại trừ các thư mục con. Đã thử tất cả mọi thứ, bao gồm các mẫu chính xác được viết ở đây, nhưng không thành công. Cuối cùng tôi đã thêm một dòng trống bổ sung giữa các mẫu thư mục và nó đang hoạt động. Có lẽ một vấn đề mã hóa. Tôi có cửa sổ và mã hóa cái này trong UTF8.
RoadBump

Câu trả lời:


550

Bạn đã thử ký tự đại diện chưa?

Solution/*/bin/Debug
Solution/*/bin/Release

Với phiên bản 1.8.2 của git, bạn cũng có thể sử dụng **ký tự đại diện để khớp với bất kỳ cấp thư mục con nào:

**/bin/Debug/
**/bin/Release/

8
Nó hoạt động, ngoại trừ nếu có một thư mục con với một dự án khác, ví dụ như Solution / Module / Project, vì vậy bây giờ tôi đã thêm / * / * / bin / Debug và / * / * / * / bin / Debug (cho phụ thư mục). Có vẻ như bạn phải thêm một thư mục con ký tự đại diện cho mỗi cấp trong cấu trúc thư mục của bạn.
Marcel

1
@Marcel: Chà, git chắc chắn sẽ không bỏ qua bất kỳ tệp nào bạn không nói với nó - nó bỏ qua mọi thứ phù hợp với các ký tự đại diện, không hơn, không kém.
Cascabel

Tôi nghĩ rằng ngôi sao đôi sẽ vượt qua ranh giới thư mục, tức là: / ** / bin / Debug
Trent

11
@Tara: Thật không may, nó không.
Tuukka Mustonen

2
Có một lỗi trên Visual Studio liên quan đến **. Nên sửa chữa ngay bây giờ. liên kết
Bogac 10/03/2015

106

Bạn có thể sử dụng .gitignore ở cấp cao nhất để bỏ qua tất cả các thư mục trong dự án có cùng tên. Ví dụ:

Debug/
Release/

Điều này sẽ cập nhật ngay lập tức để nó hiển thị khi bạn thực hiện trạng thái git. Đảm bảo rằng các thư mục này chưa được thêm vào git, vì điều đó sẽ ghi đè bỏ qua.


Điều tương tự có thể được thực hiện bằng cách thêm các mẫu vào $GIT_DIR/.git/info/excludetệp OP .
Tim Henigan

1
Sự khác biệt là tệp .gitignore sẽ tuân theo mã, vì vậy nó được áp dụng ở mọi nơi. Trong khi tệp loại trừ chỉ cục bộ đối với kho lưu trữ của bạn, có nghĩa là tệp chỉ áp dụng cho kho lưu trữ cụ thể đó. Trừ khi các ủy viên khác có lý do muốn cam kết các thư mục này, tôi sẽ khuyên bạn nên sử dụng .gitignore.
Andreas

1
Một vấn đề khác với điều này là nếu bạn có một dự án trong giải pháp của mình có tên là Debug, sau đó cũng sẽ bị bỏ qua. Tôi nghĩ rằng giải pháp này là sự kết hợp của tất cả các câu trả lời và nhận xét - cơ cấu lại giải pháp để giữ các dll chung hoặc được tham chiếu trong một thư mục khác, sau đó bỏ qua "bin /" và / hoặc sử dụng ký tự đại diện.
Marcel

16
+1 Để nhận xét về việc đảm bảo các thư mục chưa được thêm vào git. Nếu đã được thêm vào git, hãy làm:git rm -rf DirectoryName/
levibostian

57

Câu hỏi không hỏi về việc bỏ qua tất cả các thư mục con, nhưng tôi không thể tìm thấy câu trả lời ở bất cứ đâu, vì vậy tôi sẽ đăng nó : */*.


1
Bất kỳ cơ hội bạn có thể làm rõ? Tôi đã thử tất cả các loại biến thể về điều này và không thể git addbỏ qua một thư mục và tất cả các tệp trong tất cả các thư mục con của thư mục đó. Tôi đã cố gắng dirname/, dirname/*, dirname/**, dirname/*/*, ngay cả trong sự tuyệt vọng dirname/*/*/*, dirname/*/*/*/*, dirname/*/*/*/*/*.
Chris

3
*/*bỏ qua tất cả các thư mục con nhưng không phải các tệp trong thư mục hiện tại. Để bỏ qua một thư mục con cụ thể là sử dụng gitignore bình thường. dirname, dirname/dirname/*tất cả công việc cho tôi. Có bất cứ điều gì trong thư mục đã được cam kết?
mgold

Đó là một repo hoàn toàn mới - Tôi xóa toàn bộ .gitthư mục giữa các lần thử, sau git initđó git add --all .(cũng đã thử mà không có --all), sử dụng 1.9.4.msysgit.1. Mỗi thư mục con không trống trong thư mục có tên của tôi được thêm vào chỉ mục (được kiểm tra trong TortoiseGit và git status). Không có dòng liên quan khi .gitignorebắt đầu !nhưng phải có một số xung đột. Giải quyết ngay bây giờ bằng cách loại bỏ các thư mục trong add. Đoán đây là một cái gì đó sẽ cần đào thêm một chút để cung cấp thông tin cần thiết để chẩn đoán. Cảm ơn đã trấn an tôi rằng tôi không hiểu nhầm cú pháp.
Chris

Điều gì sẽ xảy ra nếu tôi cần bỏ qua một thư mục bên trong một thư mục, nhưng không phải là thư mục đầu tiên? Như trong diễn đàn / ignorethisfolder / ... nhưng anh ta không bỏ qua thư mục được gọi là diễn đàn
Jean Carlos Racoski

Điều này không làm việc cho tôi trong việc bỏ qua một thư mục có tên bắt đầu bằng dấu chấm. " /. " Và ". * / *" cũng không hoạt động.
Tony

44

Tất cả các câu trả lời trên đều hợp lệ, nhưng một điều mà tôi không nghĩ là được đề cập là một khi bạn thêm một tệp từ thư mục đó vào repo, bạn không thể bỏ qua thư mục / thư mục con có chứa tệp đó (git sẽ bỏ qua lệnh đó ).

Để bỏ qua các tập tin đã thêm chạy

$ git rm --cached

Nếu không, bạn sẽ phải xóa tất cả các tệp khỏi thư mục đích của repo trước - và sau đó bạn có thể bỏ qua thư mục đó.


12
git rm --cached nếu bạn muốn chúng không bị theo dõi / không liên quan đến lịch sử nhưng muốn giữ các tệp nguyên vẹn cục bộ.
Erik Reppen

29

Bên cạnh việc đặt các mục chính xác trong tệp .gitignore của bạn, nếu bạn đang cố gắng bỏ qua một cái gì đó đã được thêm vào repo, bạn phải làm git rm -r /path/to/dirvà cam kết điều đó trước khi bạn thêm thư mục vào tệp .gitignore của bạn. Nếu không, điều duy nhất git sẽ bỏ qua là chỉ thị bỏ qua của bạn.


19

Cách duy nhất tôi có được điều này để làm việc trên máy của mình là làm theo cách này:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
/*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

Lưu ý cách bạn phải cho phép rõ ràng nội dung cho từng cấp độ bạn muốn đưa vào. Vì vậy, nếu tôi có 5 thư mục con sâu theo chủ đề, tôi vẫn cần đánh vần nó ra.

Đây là từ nhận xét của @ Yarin tại đây: https://stackoverflow.com/a/5250314/1696153

Đây là những chủ đề hữu ích:

Tôi cũng đã thử

*
*/*
**/**

**/wp-content/themes/**

hoặc là /wp-content/themes/**/*

Không ai trong số đó làm việc cho tôi cả. Rất nhiều dấu vết và lỗi!


13

Để loại trừ nội dung và thư mục con:

**/bin/*

Để chỉ loại trừ tất cả các thư mục con nhưng lấy nội dung, hãy thêm "/":

**/bin/*/

9

Để bỏ qua tất cả các thư mục con, bạn chỉ cần sử dụng:

**/

Điều này hoạt động như phiên bản 1.8.2 của git.


8

Cách chung để bỏ qua tất cả các thư mục con, trong khi tiếp tục theo dõi các tệp trong /binthư mục sẽ là thêm dòng sau vào tệp .gitignore của dự án của bạn:

bin/*/*

Nếu bạn muốn bỏ qua chỉ các thư mục con có tên cụ thể, bạn có thể làm:

bin/Debug/*
bin/Release/*

nb. nếu binthư mục không nằm trong thư mục gốc của dự án của bạn (cùng với tệp .gitignore), thì thay vì ví dụ. bin/*/*bạn có thể cầnpath/to/bin/*/*

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.