我有一些CVS格式(RCS格式)的旧代码。我想避免签入新版本只是为了修复缩进,而不是语法。通常,原始开发人员不再拥有帐户(他们已经离开了公司)。如果我要修复该缩进,则该更改将在输出中使用我的用户帐户标记cvs annotate
这是不可取的。由于仅更改缩进,因此不会更改功能。最终结果是,当再次签出文件时,其缩进将得到更正,并且cvs annotate
显示最后一个"真实"更改的那行及其关联的作者。
那么,这是否可以通过直接编辑,v
RCS文件(例如,在锁定的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
文件的内容是(是?
- 后备箱中的最新版本
- 使用反向增量生成每个早期主干版本
- 但使用前向增量来生成每个分支版本
这意味着要替换某处的特定版本,您必须:
- 找到它在干线或分支流中的位置。
- 如果它在主干中,则在替换此特定主干版本时重写以前的主干增量,这可能意味着重写此增量或就地重写完整的最终版本;
- 否则(它是分支版本),重写后续增量,同时重写此版本的前置版本导致此版本的增量。
此过程可能非常容易出错。
伪造用户名要简单得多。 生成文件的更新版本,并将其作为您打算获得信用/责备的用户提交。 如果控制系统,则控制是否接受某些凭据。 如果没有,则无论如何都无法重写,v
文件。