【问题标题】:Mercurial, stop versioning cache directory but keep directoryMercurial,停止版本控制缓存目录但保留目录
【发布时间】:2011-02-08 14:51:24
【问题描述】:

我有一个在 Mercurial 版本控制下的 CakePHP 项目。现在app/tmp 目录中的所有文件都在进行版本控制,并且总是在变化。

我不想对这些文件进行版本控制。

我知道我可以停止运行 hg forget app/tmp/*

但这也会忘记文件结构。我想保留。

现在我知道 Mercurial 不版本目录,只版本文件,但是 CakePHP 人也足够聪明,可以在每个空目录中放置一个名为 empty 的空文件(我猜是这个原因)。

所以我想做的是告诉 Mercurial 忘记 app/tmp 下的每个文件,除了名称完全为 empty 的文件。

这个命令是什么?

【问题讨论】:

    标签: cakephp mercurial


    【解决方案1】:

    好吧,如果没有其他办法,您可以随时要求 Mercurial 忘记所有内容,然后在提交之前恢复 empty

    这是我复制它的方式,首先创建初始回购:

    hg init
    md app
    md app\tmp
    echo a>app\empty
    echo a>app\tmp\empty
    hg commit -m "initial" -A
    

    然后添加一些我们稍后要删除的文件:

    echo a >app\tmp\test1.txt
    echo a >app\tmp\test2.txt
    hg commit -m "adding" -A
    

    然后忘记我们不想要的文件:

    hg forget app\tmp\*
    hg status                     <-- will show all 3 files
    hg revert app\tmp\empty
    hg status                     <-- now empty is gone
    echo glob:app/tmp>.hgignore
    hg commit -m "ignored" -A
    

    请注意,.hgignore 所做的一切都是为了防止 Mercurial 在 addremovecommit -A 期间发现新文件,如果您明确跟踪了与您的忽略过滤器匹配的文件,Mercurial 仍将跟踪对这些文件的更改。

    换句话说,即使我在上面要求 Mercurial 忽略 app/tmp,内部的文件 empty 也不会被忽略或删除,因为我已明确要求 Mercurial 跟踪它。

    【讨论】:

    • 我不得不将行 hg revert app\tmp\empty 更改为 hg revert app\tmp\\*\emptyhg revert app\tmp\cache\\*\empty 因为它是由 tmp 中需要保留的其他目录组成的。谢谢。
    • 也很高兴知道它不会忽略您明确指定要跟踪的项目。
    【解决方案2】:

    至少理论上(我现在没有时间尝试),pattern matching 应该与hg forget 命令一起使用。因此,您可以在目录中执行hg forget -X empty 之类的操作(-X 表示“排除”)。

    您当然可以考虑使用 .hgignore。

    【讨论】:

    • 只需将它们添加到 .hgignore 中就应该完全符合他的要求。你只需要小心运行后续的hg purge(不幸的是,我学到了这一点)
    • 我会试试的。对于.hgignore,我会在里面放“app/tmp”吗?谢谢
    • @Tim,如果我创建一个名为 .hgignore 的文件,其内容为 app/tmp,它也会忽略该目录,对吗?如何使用模式匹配在忽略中排除 empty 文件,以便目录保持版本化?谢谢!!
    • 忘记所有你不想要的文件,但将empty 保留为跟踪,并将目录添加到你的忽略过滤器中。这行得通,有关详细信息,请参阅我的答案。
    【解决方案3】:

    既然你只需要这样做一次,我就这样做:

    find app/tmp -type f | grep -v empty | xargs hg forget
    hg commit
    

    从那时起,只需将其放入您的 `.hgignore'

    ^app/tmp
    

    【讨论】:

    • +1 这看起来很有趣。从我有限的知识来看,它看起来像是首先找到 tmp 中的每个文件,然后过滤掉空文件,然后将剩余的列表传递给 hg forget。但是 xargs 不限制列表吗?那会留下一些吗?不知道它是如何工作的。另外我认为 hg commit 需要一条消息。感谢您的信息。
    • 第一部分生成 app/tmp 中所有文件的列表,第二阶段从列表中删除 named empty,第三阶段运行 @987654324 @ 在剩下的所有文件名上。如果文件名或名为notempty 的文件中有空格,则需要稍微花哨的东西,但根据您的描述应该这样做。
    • 这对我很有用 - 谢谢。只是评论它以防我将来需要再次找到它!
    【解决方案4】:

    Mercurial 内置了对通配符和正则表达式的支持,如 mercurial 书中的 relevant chapter 中所述。使用了python regex 实现。

    这应该适合你:

    hg forget "re:app/tmp/.*(?<!/empty)$"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 2015-11-29
      相关资源
      最近更新 更多