Làm thế nào để tôi bảo Git bỏ qua mọi thứ trừ thư mục con?


218

Tôi muốn bỏ qua tất cả các tệp trong kho lưu trữ của tôi ngoại trừ những tệp xảy ra trong binthư mục con. Tôi đã thử thêm các mục sau vào .gitignore:

*
!bin/*

Tuy nhiên, điều này không có hiệu ứng mong muốn: Tôi đã tạo một tệp mới bên trong bin/, nhưng git statusvẫn hiển thị nothing to commit (working directory clean).

Bất kỳ đề xuất?


Câu trả lời:


273

Điều này bỏ qua các tập tin gốc & thư mục gốc, sau đó bỏ qua thư mục bin gốc:

/*
/*/
!/bin/

Bằng cách này bạn có được tất cả các thư mục bin, bao gồm các thư mục con và các tệp của chúng.


25
Vì một số lý do, điều này không phù hợp với tôi. Tôi có hai dòng /stuff/!/stuff/specific/, nhưng nó vẫn bỏ qua / thứ / cụ thể /
LB--

1
@ LB-- Tôi có một vấn đề tương tự, và git check-ignore -vnói với tôi rằng đó là vì~/.gitignore
gurney alex

@gurneyalex Tôi phát hiện ra rằng nó tự sửa nếu tôi xóa repo cục bộ và sao chép lại, nó phải là một lỗi.
LB--

2
Là / * / cần thiết?
Alex Baker

3
Điều này đã không làm việc cho tôi. Tôi đã phải thêm !/bin/vào .gitignoretập tin gốc của mình , nhưng sau đó tôi phải thêm một /bin/.gitignoretập tin với !*... Chỉ thực hiện một trong những thay đổi đó là không hiệu quả. Nó chỉ hoạt động sau khi kết hợp cả hai thay đổi.
Felipe Brahm

113

Dưới đây là cách bỏ qua mọi thứ ngoại trừ một thư mục " MY_SUPER_DUPER_TEMPLATE_directory " trong một số thư mục

Cấu trúc: / bitrix / samples / MY_SUPER_DUPER_TEMPLATE_directory

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore

1
Điều này làm việc kỳ diệu cho việc sắp xếp một gói nhà cung cấp laravel tôi đã sửa đổi! Cảm ơn bạn, bạn đã cứu tôi rất nhiều đau đầu
Maria Vilaró

Điều này nên được chọn là câu trả lời tốt nhất.
Bahman.A

63

Bạn phải loại trừ mọi thứ trên đường đến đích, nhưng bạn phải bao gồm các điểm đến:

Lưu ý: Đây là một tệp loại trừ (ví dụ .gitignore) để logic được đảo ngược. Bỏ qua tất cả, ngoại trừ thư mục tsp, bỏ qua tất cả trong thư mục tsp, ngoại trừ thư mục src ...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore

11
+1 cho nguyên tắc bao gồm một thư mục, sau đó, ngoại trừ nội dung của nó, sau đó, bao gồm cả thư mục con mong muốn, v.v. Tôi đã kết thúc bằng cách sử dụng câu trả lời này cho các dự án của mình.
John Jesus

40

Vấn đề duy nhất bạn có là binbản thân thư mục không khớp với bin/*mẫu nên git thậm chí không tìm trong binthư mục.

Có hai giải pháp mà mùa xuân đến tâm trí.

.gitignore :

*
!/bin/
!bin/*

hoặc là

.gitignore :

*
!/bin/

bin/.gitignore :

!*

Tôi thích giải pháp thứ hai vì giải pháp đầu tiên sẽ không dừng việc bỏ qua các tệp bintrong thư mục nằm trong thư mục con không được gọi bin. Điều này có thể hoặc không quan trọng trong tình huống của bạn.


2
Không làm việc cho tôi. Tôi phải có một .gitignore như thế này để làm cho nó hoạt động: # Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* Không có mã khối trong các bình luận?
xlttj

1
Câu trả lời của Tyler có giải pháp tập tin duy nhất tốt hơn
Yarin

19

Từ tài liệu git chính thức , một trong những ví dụ cho biết:

Ví dụ để loại trừ mọi thứ trừ một thư mục cụ thể foo / bar (lưu ý / * - không có dấu gạch chéo, ký tự đại diện cũng sẽ loại trừ mọi thứ trong foo / bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Đối với một lời giải thích về dấu gạch chéo hàng đầu: Khi nào nên sử dụng dấu gạch chéo hàng đầu trong gitignore .


Cảm ơn bạn một triệu, điều này đã làm việc cho tôi! Lưu ý với người khác rằng thứ tự của các dòng ở đây rất quan trọng, bạn không thể có! / Foo / bar trước / foo / * chẳng hạn.
Iamsodarncool

13

Hãy thử làm theo phiên bản GIT mới nhất.

*
!*/
!/path/to/your/dir/**

nó thực sự phải là! / path / to / your / dir / ** cho dòng cuối cùng
faham

@faham, vâng, chỉ cần thêm nó.
Kirby

11

Tôi nghĩ rằng một cách tốt hơn sẽ là neo từng mẫu vào thư mục git hàng đầu bằng cách bắt đầu mẫu bằng dấu gạch chéo:

/*
!/public_html
!/.gitignore

Thay vì bỏ qua tất cả các tệp, nó sẽ chỉ bỏ qua các tệp cấp cao nhất, không phải các tệp trong thư mục bạn không muốn bỏ qua.


8

Điều này .gitignorelàm việc cho tôi:

*/
/*
!bin/

5

Hãy thử lỗi git tối nghĩa này.

!bin**/**

Hy vọng nó giúp :)

Hỗ trợ tài liệu mẫu git bug

PS: hãy thử nó trước khi bình luận.


0

Tôi đã phải làm điều này gần đây:

*
!sub-dir/
!sub-dir/*

Tôi không chắc tại sao tôi cần hai dòng để loại trừ một thư mục, nhưng đây là những gì làm việc cho tôi và macos.

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.