如何在.gitignore中获得等效的.hgignore的正则表达式^ var /(?!\ log | .dummy)和^ var / log /(?!\。dummy)?

时间:2011-03-20 07:13:06

标签: git mercurial gitignore hgignore

我正在将我的Mercurial存储库转换为Git。部分文件系统如下所示:

|-- .gitignore
|-- .hgignore
`-- var
    |-- .dummy
    |-- asdf
    `-- log
        |-- .dummy
        `-- asdf

我的.hgignore文件使用正则表达式。我的.hgignore文件的一部分如下:

^var/(?!\log|.dummy)
^var/log/(?!\.dummy)

我想跟踪.dummy个文件,但不跟踪asdf个文件。 hg status返回:

? var/.dummy
? var/log/.dummy

如何在.gitignore中获得相同的效果?我尝试过以下方法:

/var/**/*
!/var/.dummy
!/var/log/.dummy

但是这不会忽视var/asdf。如何跟踪var/.dummyvar/log/.dummy并忽略var/asdfvar/log/asdf

2 个答案:

答案 0 :(得分:10)

如果您只使用.dummy文件作为占位符来确保在进行干净检查时始终获得这些特定(几乎为空)的目录,那么您应该只排除/var和使用git add -f var/.dummy var/log/.dummy开始显式跟踪占位符文件。有效的结果是您将忽略除明确跟踪的.dummy文件之外的所有内容。

另一方面,如果您计划扩展几乎空目录的层次结构,而不仅仅是var/log,那么您可以使用一些解释。

规则在gitignore(5)中有所描述,但有时很难理解所有规则以及它们如何相互作用。重要的是,最后一条规则获胜,而后来的规则只有在它们所依据的目录尚未被完全忽略时才有效。这意味着如果您忽略了目录,则必须先取消它们的内容,然后才能取消内容的一些内容(同时重新忽略其余内容)。


如果您想自动忽略.dummyvar个文件以外的所有内容,那么最简单的方法是将.gitignore文件放在var目录中,而不是在顶层做它。我在另一个SO answer中描述了这个解决方案。

# var/.gitignore
*
!/.gitignore
!.dummy
!*/
  1. 忽略此目录中的所有内容(var)。
  2. 但是,请不要忽略这一个.gitignore文件(如果您愿意git add -f开始跟踪此.gitignore文件,则可以将其删除。)
  3. 此外,请勿忽略以此目录(.dummy)为根的层次结构中任何深度的var个文件。
  4. 此外,不要忽略此目录下任何深度的任何目录(var) 如果没有此规则,第一条规则将忽略子目录,Git甚至不会打开它们来查找.dummy文件。
  5. 最后两个模式是“递归的”,因为它们没有非尾部斜杠(意味着*除了其他字符外还会匹配斜杠)。尾部斜杠使模式仅匹配目录。前导和嵌入式斜杠有效地将模式锚定到.gitignore文件的位置(或者来自其他排除文件的模式的存储库的根)。我们的想法是,普通*.o应该匹配任何地方,但dir/*.o应仅匹配dir下的项目(我们可以/*.o使用dir/.gitignore来实现{{1} }})。


    如果您无法容忍var/.gitinore文件,那么您仍然可以按照自己的要求进行操作,但无法在.dummy下的任何位置自动“取消”var个新# .gitignore at root of repository /var/* !/var/.dummy !/var/log/ /var/log/* !/var/log/.dummy 文件排除模式。

    var
    1. 忽略此.gitignore文件的兄弟var/.dummy目录下的所有内容。
    2. 但是,不要忽略var/log
    3. 另外,请勿忽略目录var/log
    4. 但是,请直接在var/log/.dummy
    5. 中忽略所有内容
    6. 但是,不要忽略.dummy
    7. 模式是:unignore一个有趣的目录(第一次跳过这个,因为默认情况下一切都是“unignored”),忽略目录中的内容,取消其中的log文件。对层次结构的每个较深部分重复该模式。

      您可以将*替换为var,使其适用于var/cache/.dummy下的任何目录,但它不会自动适用于更深层的目录(例如,它适用于{ {1}},但不适用于var/log/ssh/.dummy)。这是因为我们使用非尾部斜杠并锚定模式。要手动使其工作,您必须重复该模式以为更深层部分生成更多排除规则(unignore有趣的目录,忽略dir的内容,unignore文件)。

答案 1 :(得分:2)

您无需使用正则表达式排除.dummy。只需忽略所有内容,然后手动添加所有.dummy

忽略仅影响状态命令结果。