2010-10-06 31 views
6

Vì vậy, cho phép nói rằng tôi có một cấu trúc thư mục như vậyLàm cách nào để viết một quy tắc trong gitignore để bỏ qua tất cả các tệp ngoại trừ các thư mục trong một số thư mục?

uploads/ 
--dir1/ 
----one.txt 
----two.txt 
----dir2/ 
------one.txt 
------two.txt 

Tôi muốn bất kỳ thư mục và thư mục con của nhật để được theo dõi nhưng không phải bất kỳ tập tin trong nó với ngoại lệ của một tập tin dummy vì git không theo dõi thư mục.

Tôi sẽ nghĩ rằng một cái gì đó như thế này sẽ làm việc nhưng nó không.

* 
!.gitignore 

Trả lời

7

Khi bạn nói với nó để bỏ qua *, Git sẽ không recurse vào bất kỳ thư mục con (ngay cả khi bạn có một “unignore” mô hình mà có thể phù hợp với một cái gì đó bên một trong những thư mục).

Có một chút ngôn ngữ mẫu gitignore có thể trợ giúp. Dấu gạch chéo theo sau buộc buộc mẫu chỉ áp dụng cho các thư mục. Vì vậy, bạn sẽ có thể sử dụng điều này:

# .gitignore 
* 
!.keep 
!*/ 

Trong các cuộc biểu tình dưới đây tôi sử dụng trên .gitignore và có một tập tin bổ sung (tên do-not-keep) bên cạnh mỗi tập tin .keep. Bạn có thể thấy rằng nó hoạt động cho nhiều cấp độ của thư mục con và không hiển thị các tệp khác. Bạn sẽ phải sắp xếp cho mỗi thư mục có .keep riêng (hoặc bất kỳ) nào thông qua một số phương pháp độc lập.

% git status --short -uall 
?? a/.keep 
?? a/b/.keep 
?? a/b/c/.keep 
?? a/b/c/d/.keep 
?? e/.keep 
?? e/f/.keep 
?? e/f/g/.keep 
?? h/.keep 
?? h/i/.keep 
?? j/.keep 

Điều này được thực hiện với Git 1.7.3.1, nhưng tôi hy vọng nó cũng sẽ hoạt động với các phiên bản khác.

Quá trình cài đặt diễn:

% git init 
% mkdir -p a/b/c/d e/f/g h/i j 
% zargs -i.. -- **/*(/) -- touch ../.keep ../do-not-keep 
% tree -aI .git .          
. 
|-- .gitignore 
|-- a 
| |-- .keep 
| |-- b 
| | |-- .keep 
| | |-- c 
| | | |-- .keep 
| | | |-- d 
| | | | |-- .keep 
| | | | `-- do-not-keep 
| | | `-- do-not-keep 
| | `-- do-not-keep 
| `-- do-not-keep 
|-- e 
| |-- .keep 
| |-- do-not-keep 
| `-- f 
|  |-- .keep 
|  |-- do-not-keep 
|  `-- g 
|   |-- .keep 
|   `-- do-not-keep 
|-- h 
| |-- .keep 
| |-- do-not-keep 
| `-- i 
|  |-- .keep 
|  `-- do-not-keep 
`-- j 
    |-- .keep 
    `-- do-not-keep 

10 directories, 21 files 
+0

Đừng bạn cũng cần phải có '.gitignore' liệt kê trong riêng file' .gitignore' tiểu dir của để cho bỏ qua tập tin riêng của mình để được theo dõi bởi git? – beporter

+0

@beporter: Tôi thường sẽ tự theo dõi nó bằng 'git add -f .gitignore' (khi nó được theo dõi, nó không quan trọng cho dù nó có bị bỏ qua hay không). Nhưng, nếu bạn không muốn thực hiện bước "force" một lần đó, thì bạn có thể thêm mục nhập bổ sung đó (hoặc, có thể tốt hơn, '! /. Gitignore' để chỉ unignore' .gitignore' cấp đầu tiên). –

Các vấn đề liên quan