为什么gitignore在这种情况下不起作用?

时间:2011-11-16 17:53:04

标签: git gitignore

我有两个我想忽略的文件:

  • .idea / workspace.xml
  • someapp / SRC / .idea / workspace.xml

我认为将这条规则添加到.gitignore就足够了:

.idea/workspace.xml

但它只捕获顶级.idea / workspace.xml(git status显示someapp / src / .idea / workspace.xml为未跟踪)。

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

5 个答案:

答案 0 :(得分:21)

这有changed in git 1.8.4

  

使用平台fnmatch(3)函数(很多地方,如pathspec匹配,.gitignore和.gitattributes)已被wildmatch取代,允许“foo / ** / bar”匹配“foo / bar”,“foo / a / bar“等等。

**/.idea/workspace.xml现在可以在此示例中使用。

答案 1 :(得分:11)

  
      
  • [...]
  •   
  • 如果模式不包含斜杠/,git将其视为shell glob模式,并检查相对于.gitignore文件位置的路径名匹配(相对于工作树的顶层,如果不是一个.gitignore文件)。
  •   
  • 否则,git将模式视为适合fnmatch(3)使用FNM_PATHNAME标志的shell glob:模式中的通配符与路径名中的/不匹配。 [...]
  •   

一旦路径包含斜杠,Git将不再检查路径中的匹配,而是直接使用glob行为。因此,您无法匹配.idea/workspace.xml,只能匹配workspace.xml

Git manual: gitignore

答案 2 :(得分:5)

请参阅gitignore手册中的示例:

  

“Documentation / * .html”匹配“Documentation / git.html”但不匹配   “Documentation / ppc / ppc.html”或“tools / perf / Documentation / perf.html”

因此.idea/workspace.xml将匹配根{但someapp/src/.idea/workspace.xml

但是根据你的fnmatch实现,这是你在.gitignore中所需要的:

.idea/workspace.xml
**/.idea/workspace.xml

答案 3 :(得分:2)

试试这个

/**/.idea/workspace.xml

答案 4 :(得分:0)

根据gitignore手册页:

  

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

(强调我的)