是否可以在不添加新提交的情况下安全地修复 C/C++ 中缩进严重的 C/C++ 代码?
Is it possible to repair badly indented C/C++ code in RCS/CVS safely without adding new commits?
我有一些 CVS 格式的旧代码 (RCS format)。我想避免签入新修订版只是为了修复缩进,而不是语法。通常,原始开发人员不再拥有帐户(他们已经离开公司)。如果我要修复该缩进,那么该更改会在 cvs annotate
输出中用我的用户帐户标记,这是不可取的。由于只更改了缩进,因此功能没有更改。最终结果是,当文件再次签出时,它的缩进被更正,并且 cvs annotate
显示最后 "real" 更改的行及其相关作者。
那么,直接编辑 ,v
RCS 文件(例如,在锁定的 CVSROOT 上的文件副本上)是否可以做到这一点,或者是否有检查此类编辑的校验和 ( RCS format 暗示了一个 "integrity" 字段,但不清楚它是否会使此类更改无效)?注意这是特定于 CVS 的; Git 等其他源代码控制系统具有内置机制。 (正在考虑迁移到其他系统,但这是题外话)。
似乎表明有现成的工具可用于解析底层 RCS 格式(,v 文件),因此可以用作此基础,以防确实存在某种类型文件中的校验和。不过如果能直接编辑就更好了
理论上当然可以就地重写 RCS 修订文件。但是,在实践中实现起来非常棘手。作为您链接注释的答案,RCS ,v
文件的内容是(是?):
- 主干中的最新版本
- 使用反向增量生成每个较早的主干版本
- 但使用前向增量来生成每个分支版本
这意味着要替换某处的特定版本,您必须:
- 找到它在主干或支流中的位置。
- 如果在主干中,在替换这个特定的主干版本的同时重写之前的主干增量,这可能意味着重写这个增量或者在原地重写完整的最终版本;
- 否则(是分支版本),重写后续的delta,同时重写这个版本的前身导致这个版本的delta。
这个过程可能很漂亮error-prone。
直接伪造用户名就简单多了。生成该文件的更新版本并以您打算获取 credit/blame 的用户身份提交它。 If you control the system, you control whether some credentials are accepted. 如果没有,您无论如何都无法重写 ,v
文件。
如果可能的话,我会避免重写原始 ,v
文件。那里有很多事情可能会出错,能够提供帮助的人每天都在减少。
我会向 RCS 建议 "lying"。像这样:
$ co -l file.ext
$ prettyformat file.ext
$ lastauthor=$(rlog file.ext | awk '=="date:"{print ;exit}')
$ ci -u -w"${lastauthor%;}" -m'formatting updates' file.ext
我不知道你的 prettyformat
命令是什么,但你可以换进去。
这里的基本思想是我们将对每个文件进行更新,但我们将 "fake" 作者姓名 -w
。这很好,它只是 ,v
文件中的一个文本字符串,没有与之相关的魔法。
如果您还关心日期,您也可以使用 -d
选项伪造它们:
$ lastmod=$(rlog file.ext | awk '=="date:"{print ,;exit}')
$ co -l file.ext
$ prettyformat file.ext
$ lastauthor=$(rlog file.ext | awk '=="date:"{print ;exit}')
$ ci -u -w"${lastauthor%;}" -d"${lastmod%;}" -m'formatting updates' file.ext
这样,如果您将来选择将东西迁移到 CVS 以外的东西,无论格式如何更改,每个文件的年龄都会被正确记录。
我有一些 CVS 格式的旧代码 (RCS format)。我想避免签入新修订版只是为了修复缩进,而不是语法。通常,原始开发人员不再拥有帐户(他们已经离开公司)。如果我要修复该缩进,那么该更改会在 cvs annotate
输出中用我的用户帐户标记,这是不可取的。由于只更改了缩进,因此功能没有更改。最终结果是,当文件再次签出时,它的缩进被更正,并且 cvs annotate
显示最后 "real" 更改的行及其相关作者。
那么,直接编辑 ,v
RCS 文件(例如,在锁定的 CVSROOT 上的文件副本上)是否可以做到这一点,或者是否有检查此类编辑的校验和 ( RCS format 暗示了一个 "integrity" 字段,但不清楚它是否会使此类更改无效)?注意这是特定于 CVS 的; Git 等其他源代码控制系统具有内置机制。 (正在考虑迁移到其他系统,但这是题外话)。
似乎表明有现成的工具可用于解析底层 RCS 格式(,v 文件),因此可以用作此基础,以防确实存在某种类型文件中的校验和。不过如果能直接编辑就更好了
理论上当然可以就地重写 RCS 修订文件。但是,在实践中实现起来非常棘手。作为您链接注释的答案,RCS ,v
文件的内容是(是?):
- 主干中的最新版本
- 使用反向增量生成每个较早的主干版本
- 但使用前向增量来生成每个分支版本
这意味着要替换某处的特定版本,您必须:
- 找到它在主干或支流中的位置。
- 如果在主干中,在替换这个特定的主干版本的同时重写之前的主干增量,这可能意味着重写这个增量或者在原地重写完整的最终版本;
- 否则(是分支版本),重写后续的delta,同时重写这个版本的前身导致这个版本的delta。
这个过程可能很漂亮error-prone。
直接伪造用户名就简单多了。生成该文件的更新版本并以您打算获取 credit/blame 的用户身份提交它。 If you control the system, you control whether some credentials are accepted. 如果没有,您无论如何都无法重写 ,v
文件。
如果可能的话,我会避免重写原始 ,v
文件。那里有很多事情可能会出错,能够提供帮助的人每天都在减少。
我会向 RCS 建议 "lying"。像这样:
$ co -l file.ext
$ prettyformat file.ext
$ lastauthor=$(rlog file.ext | awk '=="date:"{print ;exit}')
$ ci -u -w"${lastauthor%;}" -m'formatting updates' file.ext
我不知道你的 prettyformat
命令是什么,但你可以换进去。
这里的基本思想是我们将对每个文件进行更新,但我们将 "fake" 作者姓名 -w
。这很好,它只是 ,v
文件中的一个文本字符串,没有与之相关的魔法。
如果您还关心日期,您也可以使用 -d
选项伪造它们:
$ lastmod=$(rlog file.ext | awk '=="date:"{print ,;exit}')
$ co -l file.ext
$ prettyformat file.ext
$ lastauthor=$(rlog file.ext | awk '=="date:"{print ;exit}')
$ ci -u -w"${lastauthor%;}" -d"${lastmod%;}" -m'formatting updates' file.ext
这样,如果您将来选择将东西迁移到 CVS 以外的东西,无论格式如何更改,每个文件的年龄都会被正确记录。