Mercurial相当于.gitattributes污迹/干净过滤器

Mercurial相当于.gitattributes污迹/干净过滤器,mercurial,Mercurial,受答案启发,我想知道是否有一种方法可以在Mercurial中获得与在.gittributes文件中为git指定的污迹/干净过滤器相同的行为。这就是,在提交之前对某些文件应用一些预处理,而不影响工作副本 您可以在过滤器小节的ongittributes中找到我的意思的正确描述。此外,从: 事实证明,您可以编写自己的过滤器,用于在提交/签出时对文件进行替换。这些被称为“干净”和“污迹”过滤器。在.gittributes文件中,您可以为特定路径设置过滤器,然后设置脚本,以便在文件签出之前(“涂抹”,请参

受答案启发,我想知道是否有一种方法可以在
Mercurial
中获得与在
.gittributes
文件中为
git
指定的污迹/干净过滤器相同的行为。这就是,在提交之前对某些文件应用一些预处理,而不影响工作副本

您可以在
过滤器
小节的on
gittributes
中找到我的意思的正确描述。此外,从:

事实证明,您可以编写自己的过滤器,用于在提交/签出时对文件进行替换。这些被称为“干净”和“污迹”过滤器。在.gittributes文件中,您可以为特定路径设置过滤器,然后设置脚本,以便在文件签出之前(“涂抹”,请参见)和暂存之前(“清理”,请参见)处理文件。这些过滤器可以设置为做各种有趣的事情

我的用例类似于中所述:在将部分文件提交到存储库之前清理它们,但不影响工作副本

我能找到的最相似的东西是Mercurial的
编码
/
解码
功能。问题是,这个方法非常简洁(我在其他地方找不到太多信息)


但是,
编码
/
解码
功能被标记为一个。为什么呢?这是否意味着有更好的方法来实现它的功能?出于某种原因,没有合适的方法来实现这一点,但我应该像其他人一样使用此方法?

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

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

  • 它可能与其他与VCS相关的工具不能很好地交互,尤其是那些将补丁公开为diff或重命名文件的部分
  • 它通常容易出错;您正在签入一个从未测试过的版本,并且必须确保编码/解码步骤正确往返
  • 编码和解码设置实际上不是存储库的一部分,而是VCS配置的一部分。例如,这可能导致您意外地推送密码,因为您忘记在新签出中正确设置配置。特别是,新的
    hg克隆
    不会复制
    .hg/hgrc
    ,因此可能会签出未编码的文件
  • 当您使用VCS处理永久和临时工件时,您遇到的更大的问题是,您试图让它做一些它不是为之设计的事情。您缺少的是从永久工件创建临时工件的构建或部署步骤,可能与本地配置(例如,通过模板系统)结合使用。这还可以与一个钩子相结合,以防止临时工件的意外签入

    也就是说,如果您确实想使用过滤器,它的工作原理如下:您需要匹配
    [encode]
    [decode]
    部分。每个部分都有一系列
    pattern=shell命令
    条目,其中
    pattern
    描述一个文件名或一组文件名,而
    shell命令
    是将输入文件转换为输出文件的shell命令。此命令的前缀可以是
    管道:
    (默认设置),然后必须将标准输入转换为标准输出或
    临时文件:
    ,在这种情况下,该命令将转换命令行上给定的文件(由占位符
    填充
    输出文件
    指定)

    示例:

    [encode]
    secretfile = pipe: sed -e 's/FOO/BAR/g'
    [decode]
    secretfile = pipe: sed -e 's/BAR/FOO/g'
    
    使用临时文件:

    [encode]
    secretfile = tempfile: sed -e 's/FOO/BAR/g' <INFILE >OUTFILE
    [decode]
    secretfile = tempfile: sed -e 's/BAR/FOO/g' <INFILE >OUTFILE
    
    [编码]
    secretfile=tempfile:sed-e's/FOO/BAR/g'OUTFILE
    [解码]
    secretfile=tempfile:sed-e's/BAR/FOO/g'OUTFILE
    
    这两个示例在签入时将出现的
    FOO
    转换为
    BAR
    ,在签出时将出现的
    BAR
    转换为
    FOO
    。请注意,这实际上不是正确的往返:如果文件在签入时包含字符串
    BAR
    ,则在签出时它将成为
    FOO
    。编写在所有情况下都能正确执行此操作的过滤器可能相当棘手。这就是为什么单独的构建步骤几乎总是比在签入和签出中使用额外的魔法更好的原因之一