我保留同一源代码树的两个副本:一个是“工作副本”,另一个是“存储副本”。当我完成编辑“工作副本”时,我刷新“存储副本” rsync
(仅复制修改的文件,此外,工作副本中已删除的文件也将在存储副本中删除)。还有一个SCM,但它发生在“存储的副本”之后,所以我们可以在这里忽略SCM。
但现在我想在从“工作副本”刷新到“存储”副本时应用代码美化器。代码美化器可以通过 stdin/stdout 重定向来应用,但是,据我所知,rsync
在执行复制时不允许通过 stdin/stdout 过滤器。
我只想美化修改过的文件,因为我不想修改“存储副本”中未更改文件的时间戳。 “工作副本”和“存储副本”的美化规则不同,因此美化器不能应用于工作副本。
我怎样才能做到这一点?任何适用于 UNIX 的解决方案都是可以接受的,尽管我更喜欢 Bourne shell 脚本或 C 程序。如果rsync
能以某种特殊的方式来做到这一点,那就太好了。
答案1
考虑到问题和评论中解释的约束,我将首先消除用于工作副本和存储副本的样式指南之间的差异。但我知道这可能非常困难,所以请随意忽略该建议。
我不认为rsync
(IE,在复制文件时过滤文件)是在提交“存储的副本”之前尝试应用“美化”的正确位置。如果你可以使用 SCM,我会利用它;例如,使用git
, 之后rsync
:
git diff --name-only -z | xargs -O beautifier
将在所有更改的文件上运行beautifier
,假设它可以在作为参数给出的文件上运行。
如果您不能(或不会)使用 SCM,您可以使用日志rsync
(请参阅--log-file
和--log-file-format
选项)来找出rsync
复制的内容,并仅对这些文件运行美化器。
如果rsync
日志不可利用,还有另一种方法可以解决此问题:对“存储的副本”中的每个文件运行美化器,输出到临时文件,并将输出与原始文件进行比较。如果美化更改了文件,请将输出复制回原始文件。