4

我正在将 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/.dummyandvar/log/.dummy并忽略var/asdfand var/log/asdf

4

2 回答 2

10

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

另一方面,如果您计划将几乎空目录的层次结构扩展到 just 之外var/log,那么您可以使用一些解释。

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


如果您想自动.dummy忽略除. 我在另一个SO answer中描述了这个解决方案。var.gitignorevar

# var/.gitignore
*
!/.gitignore
!.dummy
!*/
  1. 忽略此目录 ( var) 中的所有内容。
  2. 但是,不要忽略这个 .gitignore 文件(如果你愿意git add -f开始跟踪这个.gitignore文件,你可以忽略它)。
  3. 此外,不要忽略.dummy以该目录为根的层次结构中任何深度的文件 ( var)。
  4. 此外,不要忽略此目录下任何深度的任何目录 ( var)。
    如果没有这条规则,第一条规则将忽略子目录,Git 甚至永远不会打开它们来查找.dummy文件。

最后两个模式是“递归的”,因为它们没有非尾随斜杠(这意味着*除了其他字符之外还会匹配斜杠)。尾部斜杠使模式只匹配目录。前导和嵌入的斜线有效地将模式锚定到.gitignore文件的位置(或其他排除文件中模式的存储库的根)。这个想法是一个普通的*.o应该匹配任何地方,但dir/*.o应该只匹配直接在下面的项目dir(我们可以/*.o在后面的效果中使用dir/.gitignore)。


如果你不能容忍一个var/.gitinore文件,那么你仍然可以按照你的要求做,但是你不能在不编辑排除模式的情况.dummy下自动“取消忽略”任何地方的新文件。var

# .gitignore at root of repository
/var/*
!/var/.dummy

!/var/log/
/var/log/*
!/var/log/.dummy
  1. 忽略var该文件的同级目录下的所有内容.gitignore
  2. 但是,不要忽视var/.dummy.
  3. 另外,不要忽略目录var/log
  4. 但是,直接忽略var/log.
  5. 但是,不要忽视var/log/.dummy

模式是:取消忽略一个有趣的目录(第一次跳过这个,因为默认情况下所有内容都是“未忽略的”),忽略目录中的内容,取消忽略其中的.dummy文件。对层次结构的每个较深部分重复该模式。

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

于 2011-03-20T10:03:01.767 回答
2

您不需要.dummy使用正则表达式排除。只需忽略所有内容并手动添加所有.dummy.

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

于 2011-03-20T07:48:33.400 回答