是否可以在不添加新提交的情况下安全地修复 RCS/CVS 中严重缩进的 C/C++ 代码?



我有一些CVS格式(RCS格式)的旧代码。我想避免签入新版本只是为了修复缩进,而不是语法。通常,原始开发人员不再拥有帐户(他们已经离开了公司)。如果我要修复该缩进,则该更改将在输出中使用我的用户帐户标记cvs annotate这是不可取的。由于仅更改缩进,因此不会更改功能。最终结果是,当再次签出文件时,其缩进将得到更正,并且cvs annotate显示最后一个"真实"更改的那行及其关联的作者。

那么,这是否可以通过直接编辑,vRCS文件(例如,在锁定的CVSROOT上的文件副本上)来实现,或者是否有校验和来检查这种编辑(RCS格式暗示了"完整性"字段,但不清楚它是否会使这种类型的更改无效)?请注意,这是特定于 CVS 的;其他源代码控制系统(如 Git)具有内置机制。 (正在考虑迁移到其他系统,但这是题外话)。

https://stackoverflow.com/a/46713192/257924 似乎表明有现成的工具可用于解析底层 RCS 格式(,v 文件),因此如果文件中确实存在某种类型的校验和,则可以用作此基础。但是,如果我可以直接进行编辑,那就更好了。

如果可以的话,我会避免重写原始,v文件。那里可能会出很多问题,可以提供帮助的人每天都在减少。

我建议改为对RCS"撒谎"。 像这样:

$ co -l file.ext
$ prettyformat file.ext
$ lastauthor=$(rlog file.ext | awk '$1=="date:"{print $5;exit}')
$ ci -u -w"${lastauthor%;}" -m'formatting updates' file.ext

我不知道你的prettyformat命令可能是什么,但你可以换进去。

这里的基本思想是,我们将对每个文件进行更新,但我们将使用-w"伪造"作者姓名。这很好,它只是,v文件中的文本字符串,没有与之相关的魔法。

如果您还担心日期,也可以使用-d选项伪造它们:

$ lastmod=$(rlog file.ext | awk '$1=="date:"{print $2,$3;exit}')
$ co -l file.ext
$ prettyformat file.ext
$ lastauthor=$(rlog file.ext | awk '$1=="date:"{print $5;exit}')
$ ci -u -w"${lastauthor%;}" -d"${lastmod%;}" -m'formatting updates' file.ext

这样,如果将来选择将内容迁移到 CVS 以外的其他内容,则无论格式更改如何,都将正确记录每个文件的年龄。

理论上,就地重写RCS修订文件当然是可能的。 不过,在实践中实现起来非常棘手。 正如您链接的答案所指出的那样,RCS,v文件的内容是(是?

  • 后备箱中的最新版本
  • 使用反向增量生成每个早期主干版本
  • 但使用前向增量来生成每个分支版本

这意味着要替换某处的特定版本,您必须:

  1. 找到它在干线或分支流中的位置。
  2. 如果它在主干中,则在替换此特定主干版本时重写以前的主干增量,这可能意味着重写此增量或就地重写完整的最终版本;
  3. 否则(它是分支版本),重写后续增量,同时重写此版本的前置版本导致此版本的增量。

此过程可能非常容易出错。

伪造用户名要简单得多。 生成文件的更新版本,并将其作为您打算获得信用/责备的用户提交。 如果控制系统,则控制是否接受某些凭据。 如果没有,则无论如何都无法重写,v文件。

最新更新