源代码树的类似镜像,仅对修改后的文件应用美化器

源代码树的类似镜像,仅对修改后的文件应用美化器

我保留同一源代码树的两个副本:一个是“工作副本”,另一个是“存储副本”。当我完成编辑“工作副本”时,我刷新“存储副本” rsync(仅复制修改的文件,此外,工作副本中已删除的文件也将在存储副本中删除)。还有一个SCM,但它发生在“存储的副本”之后,所以我们可以在这里忽略SCM。

但现在我想在从“工作副本”刷新到“存储”副本时应用代码美化器。代码美化器可以通过 stdin/stdout 重定向来应用,但是,据我所知,rsync在执行复制时不允许通过 stdin/stdout 过滤器。

我只想美化修改过的文件,因为我不想修改“存储副本”中未更改文件的时间戳。 “工作副本”和“存储副本”的美化规则不同,因此美化器不能应用于工作副本。

我怎样才能做到这一点?任何适用于 UNIX 的解决方案都是可以接受的,尽管我更喜欢 Bourne shell 脚本或 C 程序。如果rsync能以某种特殊的方式来做到这一点,那就太好了。

答案1

考虑到问题和评论中解释的约束,我将首先消除用于工作副本和存储副本的样式指南之间的差异。但我知道这可能非常困难,所以请随意忽略该建议。

我不认为rsyncIE,在复制文件时过滤文件)是在提交“存储的副本”之前尝试应用“美化”的正确位置。如果你可以使用 SCM,我会利用它;例如,使用git, 之后rsync

git diff --name-only -z | xargs -O beautifier

将在所有更改的文件上运行beautifier,假设它可以在作为参数给出的文件上运行。

如果您不能(或不会)使用 SCM,您可以使用日志rsync(请参阅--log-file--log-file-format选项)来找出rsync复制的内容,并仅对这些文件运行美化器。

如果rsync日志不可利用,还有另一种方法可以解决此问题:对“存储的副本”中的每个文件运行美化器,输出到临时文件,并将输出与原始文件进行比较。如果美化更改了文件,请将输出复制回原始文件。

相关内容