Mercurial相当于.gitattributes涂抹/清除过滤器

时间:2015-08-28 12:50:40

标签: mercurial

受到this答案的启发,我想知道是否有办法在Mercurial中获得与使用.gitattributes文件中指定的涂抹/清除过滤器获得的行为相同的行为git。这是在提交之前对某些文件应用一些预处理,而不影响工作副本

您可以在gitattributes小节的filters git documentation上找到我的意思。另外,来自Pro Git book

  

事实证明,您可以编写自己的过滤器,以便在提交/结帐时在文件中进行替换。这些被称为“干净”和“涂抹”过滤器。在.gitattributes文件中,您可以为特定路径设置过滤器,然后设置将在签出文件之前处理文件的脚本(“涂抹”,参见Figure 8-2)并在它们上演之前( “干净”,见Figure 8-3)。这些过滤器可以设置为做各种有趣的事情。

我的用例类似于this other question中所述的用例:在将某些文件提交到存储库之前清理部分文件但不影响工作副本。

我能找到的最相似的东西是Mercurial的encode / decode功能。问题是documentation on this feature非常简洁(我无法在其他任何地方找到更多信息)。

但是,encode / decode功能被标记为unloved feature。这是为什么?这是否意味着有更好的方法来做它的作用?由于某种原因,没有正确的方法可以做到这一点,但我应该像其他人那样去做这个?

谢谢!

1 个答案:

答案 0 :(得分:1)

查看您的用例,在存储库上覆盖本地修改的预期方法通常是使用MQ扩展,这允许您在本地应用未被推送到远程存储库的补丁,并且可以应用和取消应用需要(并且可以自己置于版本控制之下)。

通常,在签入或结帐时自动修改文件是有问题的:

  1. 它可能与其他与VCS相关的工具无法很好地交互,尤其是那些将补丁公开为差异或重命名文件的部分。
  2. 一般容易出错;你正在检查一个你从未测试过的版本,并且必须确保编码/解码步骤正确地往返。
  3. 编码和解码设置实际上不是存储库的一部分,而是VCS配置的一部分。例如,这可能导致您意外推送密码,因为您忘记在新的结帐时正确设置配置。特别是,新的hg clone不会复制.hg/hgrc,因此可能会检出未解码的文件。
  4. 当您使用VCS处理永久和临时工件时,您遇到的更大问题是您正在尝试使其执行不适合的操作。您缺少的是构建或部署步骤,该步骤从永久工件创建临时工件,可能与本地配置(例如,通过模板系统)一起。这也可以与防止意外检查临时工件的钩子组合。

    也就是说,如果您绝对想要使用过滤器,则其工作原理如下:您需要匹配[encode][decode]部分。每个部分都有一系列pattern = shell-command条目,其中pattern描述文件名或文件名集,shell-command是一个shell命令,用于将输入文件转换为输出文件。此命令可以通过pipe:(这是默认值)作为前缀,然后必须将标准输入转换为标准输出或tempfile:,在这种情况下,命令将转换命令行上给出的文件(指定占位符INFILEOUTFILE)。

    示例:

    [encode]
    secretfile = pipe: sed -e 's/FOO/BAR/g'
    [decode]
    secretfile = pipe: sed -e 's/BAR/FOO/g'
    

    使用tempfile:

    [encode]
    secretfile = tempfile: sed -e 's/FOO/BAR/g' <INFILE >OUTFILE
    [decode]
    secretfile = tempfile: sed -e 's/BAR/FOO/g' <INFILE >OUTFILE
    

    两个示例都会在结帐时将FOO的出现次数转换为BAR,并在结帐时将BAR转换为FOO。请注意,这实际上并没有正确地往返:如果文件在签入时包含字符串BAR,则在结帐时它将变为FOO。在所有情况下编写正确执行此操作的过滤器可能相当棘手。这就是为什么单独的构建步骤几乎总是比将额外的魔法压缩到签入和签出更好的原因之一。