gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:29:17 24 4
gpt4 key购买 nike

我正在将我的 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

最佳答案

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

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

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

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

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

  • 最后两个模式是“递归的”,因为它们没有非尾随斜杠(意味着 * 除了匹配其他字符外,还会匹配斜杠)。尾部斜杠使模式只匹配目录。前导和嵌入斜杠有效地将模式 anchor 定到 .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
  • 忽略 var 目录下的所有 .gitignore 文件的同级文件。
  • 但是,不要忽略 var/.dummy
  • 另外,不要忽略目录 var/log
  • 但是,直接忽略 var/log 中的所有内容。
  • 但是,不要忽略 var/log/.dummy

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

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

    关于git - 如何在 .gitignore 中获得等效于 .hgignore 的正则表达式 ^var/(?!\log|.dummy) 和 ^var/log/(?!\.dummy) ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5367234/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com