题 Make .gitignore会忽略除少数文件之外的所有内容


我知道.gitignore文件隐藏了Git版本中指定的文件 控制。我有一个项目(LaTeX),生成大量额外的文件(.auth, .dvi,.pdf,日志等),因为它运行,但我不希望跟踪它们。

我知道我可以(也许应该)这样做所有这些文件放在一个 在项目中单独的子文件夹,因为我可以忽略该文件夹。

但是,是否有任何可行的方法将输出文件保存在 项目树和使用.gitignore忽略除我以外的文件以外的所有内容 用Git跟踪?就像是

# Ignore everything
*

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

1170
2018-06-12 15:04


起源


重复 stackoverflow.com/q/9162919/321973 (我知道这是更新的,但答案更正确)。其实 这个答案 可能是最好的 - Tobias Kienzler


答案:


可选前缀 ! 否定了这种模式;排除的任何匹配文件   之前的模式将再次包含在内。如果否定模式匹配,   这将覆盖较低优先级模式源。

# 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/*

1708
2018-06-12 15:07



看起来这也“忽略”了子文件夹,因此无论如何都不会找到除根目录以外的任何名称为“script.pl”的文件。我现在正在使用它(使用* .pl)并且所有* .pl文件都被忽略,即使.gitignore文件下面的子目录中有很多文件也是如此 - PandaWood
@PandaWood这个问题提出来了 这里 (stackoverflow.com)。它是由第一个表达式匹配所有内容引起的,包括目录,你永远不会否定它们。要修复,添加(!* /),它匹配当前目录中的任何子目录(递归)。这无助于父答案,即将特定文件列入白名单(如果它们在子目录中,您可能希望手动指定完整路径,或使用特定于目录的.gitignore文件)。 - simont
我无法让这个工作。我忽略了一个文件夹(例如 wp/)但我不想忽略该文件夹深处的一些文件(例如 wp/path/to/some/location/*)。我能让它发挥作用的唯一方法就是做 git add -f wp/path/to/some/location/* - trusktr
@trusktr使用simont的 !*/ 例外 - Tobias Kienzler
最后一条规则的Geez: !*/ 在我徒劳无功的尝试中发挥了重要作用 .gitignore 文件工作。非常感谢你。 - racl101


如果要忽略除其中的一个文件之外的目录的整个内容,则可以为文件路径中的每个目录编写一对规则。 例如.gitignore忽略pippo文件夹,除了pippo / pluto / paperino.xml

的.gitignore

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

488
2018-05-01 12:31



很好的答案,但值得注意的是,后来有人遇到这个问题 foo 和 foo/* 是 不 一样。为了这个工作,你 需要 使用 foo/* 对于基本文件夹 - thislooksfun
@Mayank Pippo是意大利语中的Goofy,而Paperino是唐老鸭,冥王星和英语一样。它们曾经是一个非常常见的变量名三元组,用于编写样本。很高兴再次阅读它们.. :) - Ghidello
如果你想“排除文件x以外的文件夹”,那么@thislooksfun说的很重要。 - Czechnology
对我不起作用:node_modules / *!node_modules / bootstrap - SuperUberDuper
你必须包括 !.gitignore 否则这不会奏效。 .gitignore 文件也将被git取消跟踪 - suhailvs


你想用 /* 代替 * 要么 */ 在多数情况下

运用 * 是有效的,但它递归工作。从那时起它不会查看目录。人们推荐使用 !*/ 再次将目录列入白名单,但实际上最好将最高级别的文件夹列入黑名单 /*

# 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/

上面的代码将忽略除。之外的所有文件 .gitignoreREADME.mdfolder/a/b1/ 和 folder/a/b2/ 以及这两个文件夹中包含的所有内容(和 .DS_Store 和 *.log 这些文件夹中的文件将被忽略。)

显然我可以做到,例如 !/folder 要么 !/.gitignore 太。

更多信息: http://git-scm.com/docs/gitignore


141
2018-04-29 00:31



非常聪明,谢谢。 IMO,这是使用最少包含规则的WordPress网站的最佳方式。此外,未经您的明确许可,不会删除或添加任何新插件,主题或WP更新。使用GitHub桌面时,我找到了 .DS_Store 文件不会被忽略,但通过命令行这不是问题。为了解决这个问题,我不得不搬家了 **/.DS_Store 低于所有其他规则。 - Jibran
我的内部语法荧光笔对你帖子的标题有一种奇怪的反应。 - itsadok
格拉西亚斯!您还可以将文件夹中的文件列入白名单..!/some/folder/file.txt - PodTech.io


更具体一点:

示例:忽略所有内容 webroot/cache  - 但保持 webroot/cache/.htaccess

注意后面的斜杠(/) cache 夹:

失败

webroot/cache*
!webroot/cache/.htaccess

作品

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

57
2017-08-13 13:23





# ignore these
*
# except foo
!foo

49
2018-06-12 15:06





要忽略目录中的某些文件,您必须在中执行此操作 正确的顺序

例如,忽略index.php和文件夹“config”之外的文件夹“application”中的所有内容 注意订单

你必须先否定你想要的东西。

失败

application/*

!application/config/*

!application/index.php

作品

!application/config/*

!application/index.php

application/*


23
2017-08-09 08:39



错误。在“忽略一切”之后你否定了。 - EdMelo
它在这里既不起作用 - Totty.js
不要被愚弄 git status 检查你的改变是否 .gitignore 按预期工作 - Philippe Rathé
如果 git status 不会告诉你它在看什么,什么被忽略,那你怎么知道这是否有效? - kris


您可以使用 git config status.showUntrackedFiles no 并且将隐藏所有未跟踪的文件。看到 man git-config 详情。


18
2018-06-12 15:20