2011-11-16 113 views
17

我有两个文件,我希望忽略:为什么gitignore在这种情况下工作?

  • .idea/workspace.xml
  • someapp/src目录/ .idea/workspace.xml

我觉得增加这个单一规则。 gitignore就足够了:

.idea/workspace.xml 

但它仅捕获顶层.idea/workspace.xml(GIT状态显示someapp/SRC/.idea/workspace.xml作为未跟踪)。

我也试过**/.idea/workspace.xml,但这根本不起作用。帮帮我?

+0

试试还忽略'someapp/src/.idea/workspace.xml'? – Shahbaz

+0

也许* workspace.xml会做? – chelmertz

+0

@Shahbaz - 可以工作,但我不明白为什么.idea/workspace.xml不能。 – ripper234

回答

11
  • [...]
  • 如果图案不包含斜线/,GIT中把它当作一个壳glob模式并检查以防止相对于的.gitignore文件的位置的路径名的匹配(相对于工作树的顶层,如果不是.gitignore文件的话)。
  • 否则,git会将该模式视为适合fnmatch(3)使用FNM_PATHNAME标志使用的shell glob:模式中的通配符不会与路径名中的/匹配。 [...]

只要路径包含斜杠,Git会不再检查路径匹配,而是会直接使用水珠行为。因此,您不能匹配.idea/workspace.xml,但只能匹配workspace.xml

Git manual: gitignore

+0

您的结论与手册中的内容相反吗? – manojlds

+0

@manojlds我希望不是......:/如果模式不包含斜线,它将匹配路径名,但如果它包含斜线,它将不再执行此操作,并且将直接调整。 – poke

+0

是的倒退。没有斜杠= glob匹配。斜杠=没有匹配。 glob意味着“*可以匹配斜线” –

0

按照gitignore手册页:

模式在同一目录路径从的.gitignore文件中读取,或以任何父目录,在更高级别的文件模式(高达工作树顶层)被低层文件中的文件覆盖到包含文件的目录。 这些模式相对于.gitignore文件的位置相匹配。项目通常在其存储库中包含这样的.gitignore文件,其中包含作为项目构建一部分生成的文件的模式。

(重点煤矿)

5

见gitignore手册中的例子:

“文档/ * HTML” 匹配 “文档/ git.html”,而不是 “文档/ PPC/ppc.html”或“工具/ PERF /文档/ perf.html”

所以.idea/workspace.xml将匹配根之一,但不someapp/src/.idea/workspace.xml

但是根据你的fnmatch实现,这是你需要的。gitignore:

.idea/workspace.xml 
**/.idea/workspace.xml 
+1

这实际上对我不起作用。 – ripper234

+0

@ ripper234 - 就像我说的,取决于fnmatch的实现。适用于我。 – manojlds

+2

我在Windows上,也许这是差异的原因。 – ripper234

2

试试这个

/**/.idea/workspace.xml

20

这有changed in git 1.8.4

应用平台的fnmatch(3)功能(很多地方像pathspec匹配的.gitignore和.gitattributes)已被wildmatch替换,允许“foo/**/bar”匹配“foo/bar”,“foo/a/bar”等。

**/.idea/workspace.xml现在应该在这个例子中工作。

相关问题