Làm cho .gitignore bỏ qua mọi thứ trừ một vài tệp


1701

Tôi hiểu rằng tệp .gitignore che giấu các tệp được chỉ định từ kiểm soát phiên bản của Git. Tôi có một dự án (LaTeX) tạo ra nhiều tệp bổ sung (.auth, .dvi, .pdf, log, v.v.) khi nó chạy, nhưng tôi không muốn chúng bị theo dõi.

Tôi biết rằng tôi có thể (có thể nên) làm cho nó để tất cả các tệp đó được đặt trong một thư mục con riêng biệt trong dự án, vì sau đó tôi có thể bỏ qua thư mục.

Tuy nhiên, có cách nào khả thi để giữ các tệp đầu ra trong thư mục gốc của cây dự án và sử dụng .gitignore để bỏ qua mọi thứ trừ các tệp tôi đang theo dõi bằng Git không? Cái gì đó như

# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...

12
Bản sao của stackoverflow.com/q/9162919/321973 (Tôi biết đó là bản mới hơn, nhưng câu trả lời có chính xác hơn). Trên thực tế , câu trả lời này có lẽ là tốt nhất
Tobias Kienzler

Câu trả lời:


2442

Một tiền tố tùy chọn !phủ định mẫu; bất kỳ tệp phù hợp nào được loại trừ bởi một mẫu trước đó sẽ được đưa vào lại. Nếu một mẫu phủ định phù hợp, điều này sẽ ghi đè các nguồn mẫu ưu tiên thấp hơn.

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*

14
Dường như điều này cũng 'bỏ qua các thư mục con, sao cho bất kỳ tệp nào có tên' script.pl 'trong bất kỳ nội dung nào khác ngoài thư mục gốc sẽ không được tìm thấy. Hiện tôi đang sử dụng tính năng này (với * .pl) và tất cả các tệp * .pl đang bị bỏ qua mặc dù có nhiều thư mục con bên dưới tệp .gitignore
PandaWood

38
@PandaWood Vấn đề đó đã được đưa lên đây (stackoverflow.com). Nó gây ra bởi biểu thức đầu tiên khớp với mọi thứ, kể cả các thư mục mà bạn không bao giờ phủ nhận. Để khắc phục, hãy thêm (! * /), Phù hợp với bất kỳ thư mục con nào (đệ quy) trong thư mục hiện tại. Điều này sẽ không giúp phụ huynh trả lời, đó là các tệp cụ thể trong danh sách trắng (nếu chúng nằm trong thư mục con, có lẽ bạn muốn chỉ định thủ công đường dẫn đầy đủ hoặc sử dụng các tệp .gitignore dành riêng cho thư mục).
simont

40
Tôi không thể làm việc này. Tôi đang bỏ qua một thư mục (ví dụ wp/) nhưng tôi muốn KHÔNG bỏ qua một số tệp nằm sâu trong thư mục đó (ví dụ wp/path/to/some/location/*). Cách duy nhất tôi có thể khiến nó hoạt động là bằng cách thực hiệngit add -f wp/path/to/some/location/*
trusktr

13
@trusktr Sử dụng !*/ngoại lệ của simont
Tobias Kienzler

7
Geez quy tắc cuối cùng: !*/làm cho tất cả sự khác biệt trong nỗ lực vô ích của tôi để sắp xếp một .gitignoretập tin để làm việc. Cảm ơn rât nhiều.
racl101

628

Nếu bạn muốn bỏ qua toàn bộ nội dung của một thư mục ngoại trừ một tệp bên trong nó, bạn có thể viết một cặp quy tắc cho mỗi thư mục trong đường dẫn tệp. Ví dụ: .gitignore bỏ qua thư mục pippo ngoại trừ từ pippo / pluto / paperino.xml

.gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml

58
Tuyệt vời câu trả lời, nhưng đó là đáng chú ý cho bất cứ ai đi ngang qua này sau đó foofoo/*không giống nhau. Để làm việc này, bạn cần sử dụng foo/*cho thư mục cơ sở
thislooksfun

20
@Mayank Pippo là Goofy trong tiếng Ý trong khi Paperino là Donald Duck và Pluto giống như trong tiếng Anh. Chúng từng là một bộ ba tên biến rất phổ biến cho các mẫu lập trình trở lại trong những ngày qua. Thật tuyệt khi đọc lại chúng .. :)
Ghidello

Những gì @thislooksfun nói là quan trọng nếu bạn muốn "loại trừ một thư mục ngoại trừ tệp x".
Công nghệ

8
không hoạt động với tôi: node_modules / *! node_modules / bootstrap
SuperUberDuper

1
@simple_human Điều đó sẽ đúng nếu anh ta bỏ qua mọi thứ trong kho lưu trữ gốc hoặc nếu anh ta có tệp .gitignore để quan tâm, bên trong các thư mục được đề cập.
xZero

245

Bạn muốn sử dụng /*thay vì *hoặc */trong hầu hết các trường hợp

Sử dụng *là hợp lệ, nhưng nó hoạt động đệ quy. Nó sẽ không nhìn vào các thư mục từ đó trở đi. Mọi người khuyên bạn nên sử dụng !*/lại danh sách danh sách trắng, nhưng thực sự tốt hơn là đưa vào danh sách đen thư mục cấp cao nhất với/*

# Blacklist files/folders in same directory as the .gitignore file
/*

# Whitelist some files
!.gitignore
!README.md

# Ignore all files named .DS_Store or ending with .log
**/.DS_Store
**.log

# Whitelist folder/a/b1/ and folder/a/b2/
# trailing "/" is optional for folders, may match file though.
# "/" is NOT optional when followed by a *
!folder/
folder/*
!folder/a/
folder/a/*
!folder/a/b1/
!folder/a/b2/
!folder/a/file.txt

# Adding to the above, this also works...
!/folder/a/deeply
/folder/a/deeply/*
!/folder/a/deeply/nested
/folder/a/deeply/nested/*
!/folder/a/deeply/nested/subfolder

Đoạn mã trên sẽ bỏ qua tất cả các file trừ .gitignore, README.md, folder/a/file.txt, folder/a/b1/folder/a/b2/và tất cả mọi thứ chứa trong hai thư mục cuối cùng. (Và .DS_Store*.logcác file sẽ được bỏ qua trong các thư mục.)

Rõ ràng tôi có thể làm ví dụ !/folderhoặc !/.gitignorequá.

Thông tin thêm: http://git-scm.com/docs/gitignore


3
Rất thông minh, cảm ơn. IMO, đây là cách tốt nhất để thực hiện điều đó cho các trang web WordPress với số lượng quy tắc đưa vào tối thiểu. Ngoài ra, mọi plugin, chủ đề hoặc bản cập nhật WP mới sẽ không bị xóa hoặc thêm mà không có sự cho phép rõ ràng của bạn. Khi sử dụng GitHub Desktop tôi thấy .DS_Storecác tệp không bị bỏ qua, nhưng thông qua dòng lệnh thì đây không phải là vấn đề. Để giải quyết vấn đề này, tôi đã phải di chuyển **/.DS_Storebên dưới tất cả các quy tắc khác.
Jibran

7
Cú pháp bên trong của tôi highlighter đang có một phản ứng lạ với tiêu đề của bài viết của bạn.
itadok

3
Gracias! bạn cũng có thể lập danh sách trắng một tệp trong một thư mục ..! / some / folder / file.txt
PodTech.io

Tuyệt vời, sử dụng / * thay vì * đã khắc phục tất cả các vấn đề của tôi khi các câu trả lời ở trên không. Câu hỏi duy nhất của tôi bây giờ là sự khác biệt giữa! / Thư mục và! / Thư mục / *? Nếu tôi sử dụng thư mục! / Mà không có dấu *, nó vẫn tiếp tục thay đổi tất cả các tệp trong thư mục theo như tôi có thể nói.
dallin

1
@dallin không có sự khác biệt. Một danh sách trắng một thư mục và các danh sách trắng khác cho trẻ em của thư mục đó, điều này cũng làm điều tương tự. Vấn đề duy nhất là thư mục hoặc tập tin cha mẹ phải được đưa vào danh sách trắng trước khi có thể được đưa vào danh sách trắng, vì vậy bạn không thể thực hiện /*sau đó !/nested/folder/*(hoặc tương đương !/nested/folder) mà không cần thực hiện !/nested/hoặc !/nestedtrước tiên! (và có lẽ /nested/*ở giữa). Một mẹo cần nhớ là nếu bạn đưa vào danh sách thư mục con được lồng sâu, bạn cần tô đen cho trẻ trong mỗi thư mục con, và những danh sách đen đó sẽ kết thúc bằng "ngôi sao chém" ...
Ryan Taylor

75

Cụ thể hơn một chút:

Ví dụ: Bỏ qua mọi thứ trong webroot/cache- nhưng giữ webroot/cache/.htaccess.

Lưu ý dấu gạch chéo (/) sau cachethư mục:

FAILS

webroot/cache*
!webroot/cache/.htaccess

LÀM

webroot/cache/*
!webroot/cache/.htaccess

Nếu bạn đang sử dụng Mã VS, cẩn thận không đọc sai màu của tệp sau khi áp dụng mã này cho thư mục có .gitkeep vì tên thư mục sẽ chuyển sang màu xanh nhưng tệp .gitkeep sẽ chuyển sang màu xám giống như tất cả các tệp bị bỏ qua khác; .gitkeep sẽ trông giống như bị bỏ qua nhưng bạn sẽ thấy rằng có một chữ "U" ở bên phải, cho biết rằng nó đã được phát hiện
OzzyTheGiant


28

Để bỏ qua một số tệp trong một thư mục, bạn phải làm điều này theo đúng thứ tự :

Ví dụ, bỏ qua mọi thứ trong thư mục "ứng dụng" ngoại trừ index.php và thư mục "config" chú ý đến thứ tự .

Bạn phải phủ nhận muốn bạn muốn đầu tiên.

FAILS

application/*

!application/config/*

!application/index.php

LÀM

!application/config/*

!application/index.php

application/*


38
Sai lầm. Bạn phủ nhận sau khi "bỏ qua mọi thứ".
Carlos

2
Đừng để bị lừa bởi git statuskiểm tra xem các thay đổi của bạn có .gitignorehoạt động như mong đợi không
Philippe Rathé

10
Nếu bạn git statussẽ không nói cho bạn biết nó đang nhìn cái gì và bị bỏ qua thì làm sao bạn biết nếu nó hoạt động?
kris

1
@kris Xóa bộ đệm git trước. Trước tiên hãy thực hiện "git rm --cached *" sau đó bạn có thể thực hiện "git add --all", sau đó "trạng thái git" sẽ hiển thị cho bạn tất cả các thay đổi gitignore mới.
Mark McCorkle

20

Bạn có thể sử dụng git config status.showUntrackedFiles novà tất cả các tệp không bị theo dõi sẽ bị ẩn khỏi bạn. Xem man git-configđể biết chi tiết.


Điều này thật tuyệt nếu bạn chỉ muốn cam kết một vài tệp trong số nhiều tệp!
Josh M.

16

Để loại trừ thư mục khỏi .gitignore, có thể thực hiện như sau.

!app/

app/*
!app/bower_components/

app/bower_components/*
!app/bower_components/highcharts/

Điều này sẽ bỏ qua tất cả các tập tin / thư mục con bên trong bower_componentsngoại trừ /highcharts.


14

Có một loạt các câu hỏi tương tự về điều này, vì vậy tôi sẽ đăng những gì tôi đã viết trước đây:

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 and files if you wish:
!wordpress/somefile.jpg
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!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!


2
Đây là phương pháp duy nhất hoạt động để bao gồm độc quyền các phần mở rộng tệp nhất định. Thậm chí tốt hơn, nó còn tạo ra nghệ thuật ASCII tuyệt vời: gist.github.com/Wolfgange3311999/91c671f5e4d3c56cf5a1
Matthew D. Scholefield

10

Tôi đã có một vấn đề với thư mục con.

Không hoạt động:

/custom/*
!/custom/config/foo.yml.dist

Làm:

/custom/config/*
!/custom/config/foo.yml.dist

9

Tôi đã thử tất cả các câu trả lời như được đưa ra ở trên, nhưng không có câu trả lời nào phù hợp với tôi. Sau khi đọc tài liệu gitignore ( ở đây ) tôi phát hiện ra rằng nếu bạn loại trừ một thư mục trước tiên thì tên tệp trong thư mục con sẽ không được lập chỉ mục. Vì vậy, nếu bạn sử dụng dấu chấm than sau đó để bao gồm một tệp, nó không được tìm thấy trong chỉ mục và do đó không được bao gồm trong ứng dụng khách git của bạn.

Đó là cách để tìm ra giải pháp. Tôi bắt đầu với việc thêm ngoại lệ cho tất cả các thư mục con trong cây thư mục của mình để làm cho nó hoạt động, đó là một công việc tồi tệ. Sau đó tôi đã có thể thu gọn cấu hình chi tiết vào cấu hình bên dưới, điều này hơi trái với tài liệu ..

Làm việc .gitignore:

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' subfolder
/Pro/3rdparty/*
!Pro/3rdparty/domain/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

Kết quả là tôi thấy trong ứng dụng khách git của mình rằng chỉ có hai tệp trong thư mục Pro / 3rdparty / domain / modulename / đang được tổ chức cho lần xác nhận tiếp theo và đó chính xác là những gì tôi đang tìm kiếm.

Và nếu bạn cần lập danh sách trắng một số thư mục con của cùng một thư mục thì hãy nhóm các dòng dấu chấm than bên dưới câu lệnh loại trừ như thế này:

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' & 'hosting' subfolders
/Pro/3rdparty/*
!Pro/3rdparty/domain/
!Pro/3rdparty/hosting/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

# Ignore the 'hosting' folder, except for the 'modulename' subfolder
Pro/3rdparty/hosting/*
!Pro/3rdparty/hosting/modulename/

Khác nó sẽ không làm việc như mong đợi.


Cuối cùng một câu trả lời đã làm việc. Tôi tự hỏi khi nào tôi sẽ hiểu .gitignore thực sự hoạt động như thế nào
David

8

Đó là những gì đã làm việc cho tôi, tôi chỉ muốn cam kết một plugin Cordova cho repo:

...
plugins/*
!plugins/cordova-plugin-app-customization

8

Tôi biết tôi đến trễ bữa tiệc, nhưng đây là câu trả lời của tôi.

Như @Joakim đã nói, để bỏ qua một tập tin, bạn có thể sử dụng một cái gì đó như dưới đây.

# Ignore everything
*

# But not these files...
!.gitignore
!someFile.txt

nhưng nếu tệp nằm trong các thư mục lồng nhau, sẽ hơi khó để viết các quy tắc theo cách thủ công.

Ví dụ: nếu chúng ta muốn bỏ qua tất cả các tệp trong một gitdự án, nhưng không phải a.txtlà tệp nằm trong đó aDir/anotherDir/someOtherDir/aDir/bDir/cDir. Sau đó, chúng tôi .gitignoresẽ là một cái gì đó như thế này

# Skip all files
*

# But not `aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt`
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Các .gitignoretập tin đã cho ở trên sẽ bỏ qua tất cả các thư mục và tập tin ngoại trừ!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Như bạn có thể đã lưu ý, thật khó để xác định các quy tắc đó.

Để giải quyết trở ngại này, tôi đã tạo một ứng dụng bảng điều khiển đơn giản có tên git-do-not-ign để tạo ra các quy tắc cho bạn. Tôi đã tổ chức dự án trong github với hướng dẫn chi tiết.

Ví dụ sử dụng

java -jar git-do-not-ignore.jar "aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt"

Đầu ra

!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Cũng có một phiên bản web đơn giản có sẵn ở đây

Cảm ơn bạn.


7

Tôi có Jquery và Angular từ bower. Bower đã cài đặt chúng trong

/public_html/bower_components/jquery/dist/bunch-of-jquery-files
/public_html/bower_components/jquery/src/bunch-of-jquery-source-files
/public_html/bower_components/angular/angular-files

Các jquery thu nhỏ nằm trong distthư mục và angular nằm trong angularthư mục. Tôi chỉ cần các tệp được thu nhỏ để được cam kết với github. Một số giả mạo với .gitignore và đây là những gì tôi quản lý để gợi lên ...

/public_html/bower_components/jquery/*
!public_html/bower_components/jquery/dist
/public_html/bower_components/jquery/dist/*
!public_html/bower_components/jquery/dist/jquery.min.js
/public_html/bower_components/angular/*
!public_html/bower_components/angular/angular.min.js

Hy vọng ai đó có thể tìm thấy điều này hữu ích.


7

Đây là cách tôi đã làm nó:

# Ignore everything
*

# Whitelist anything that's a directory
!*/

# Whitelist some files
!.gitignore

# Whitelist this folder and everything inside of it
!wordpress/wp-content/themes/my-theme/**

# Ignore this folder inside that folder
wordpress/wp-content/themes/my-theme/node_modules

# Ignore this file recursively
**/.DS_Store

Sử dụng gig status -uđể xem các tệp riêng lẻ trong git statuscác thư mục không bị theo dõi đệ quy - với việc bạn chỉ nhìn thấy các thư mục, điều này có thể đánh lừa bạn nghĩ rằng mọi thứ bên trong chúng đều được theo dõi


5

Giải pháp đơn giản nếu bạn cần bỏ qua mọi thứ trừ vài tệp và vài thư mục gốc :

/*
!.gitignore
!showMe.txt
!my_visible_dir

Phép thuật nằm trong /*(như được mô tả ở trên), nó bỏ qua mọi thứ trong thư mục (root) NHƯNG KHÔNG đệ quy.


4

Tôi cũng có một số vấn đề với việc phủ định các tập tin đơn lẻ. Tôi đã có thể cam kết chúng, nhưng IDE của tôi (IntelliJ) luôn phàn nàn về các tệp bị bỏ qua, được theo dõi.

git ls-files -i --exclude-from .gitignore

Hiển thị hai tệp mà tôi đã loại trừ theo cách này:

public/
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

Cuối cùng, điều này làm việc cho tôi:

public/*
!public/typo3conf/
public/typo3conf/*
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

Chìa khóa là sự phủ định của thư mục typo3conf/ đầu tiên.

Ngoài ra, dường như thứ tự của các tuyên bố không quan trọng . Thay vào đó, bạn cần phủ định rõ ràng tất cả các thư mục con, trước khi bạn có thể phủ định các tệp đơn lẻ trong đó.

Thư mục !public/typo3conf/và nội dung thư mục public/typo3conf/*là hai thứ khác nhau cho .gitignore.

Chủ đề tuyệt vời! Vấn đề này làm phiền tôi trong một thời gian;)


3

Không có gì làm việc cho tôi cho đến nay vì tôi đã cố gắng thêm một jar từ lib.

Điều này đã không làm việc:

build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar 

Điều này đã làm việc:

build/*
!build/libs

3

Tôi đã làm việc này

# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib

2

Có vấn đề tương tự như OP nhưng không có câu trả lời nâng cao nào trong số 10 câu trả lời thực sự hiệu quả .
Cuối cùng tôi đã tìm ra những điều sau đây

Cú pháp sai:

*
!bin/script.sh

Cú pháp đúng:

*
!bin
!bin/script.sh

Giải thích từ trang người đàn ông gitignore :

Một tiền tố tùy chọn "!" trong đó phủ nhận mô hình; bất kỳ tệp phù hợp nào được loại trừ bởi một mẫu trước đó sẽ được đưa vào lại. Không thể bao gồm lại một 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, do đó, 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.

Ví dụ mở rộng:

$ cây.

.
├── .gitignore
└── bin
    ├── ignore.txt
    └── sub
        └── folder
            └── path
                ├── other.sh
                └── script.sh

$ mèo .gitignore

*
!.gitignore
!bin
!bin/sub
!bin/sub/folder
!bin/sub/folder/path
!bin/sub/folder/path/script.sh

$ git status --untracked-files --ignored

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
        bin/sub/folder/path/script.sh

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)
        bin/ignore.txt
        bin/sub/folder/path/other.sh

nothing added to commit but untracked files present (use "git add" to track)

1

Ý chính

# Ignore everything
*

# But not these files...
!script.pl
!template.latex

Và có thể bao gồm:

!.gitignore

Tài liệu tham khảo

Từ https://git-scm.com/docs/gitignore :

Một tiền tố tùy chọn " !" phủ định mẫu; bất kỳ tệp phù hợp nào được loại trừ bởi một mẫu trước đó sẽ được đưa vào lại. Không thể bao gồm lại một 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, do đó, 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. Đặt dấu gạch chéo ngược (" \") trước dấu "" đầu tiên !cho các mẫu bắt đầu bằng chữ " !", ví dụ: "\!important!.txt ".

...

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ứ bên trong foo/bar):

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

0

Tôi dường như đã tìm thấy một cái gì đó làm việc cho tôi mà không ai khác đề cập.

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# And if you want to include a sub-directory and all sub-directory and files under it, but not all sub-directories
!subdir/
!subdir/**/*

Về cơ bản, nó dường như phủ nhận một thư mục con khỏi bị bỏ qua, bạn phải có hai mục, một mục cho chính thư mục con !subdir/và sau đó một mục khác mở rộng ra tất cả các tệp và thư mục trong đó!subdir/**/*

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.