Можно ли безопасно восстановить код C / C++ с плохим отступом в RCS / CVS без добавления новых коммитов?

У меня есть старый код в формате CVS (Формат RCS). Я бы хотел избежать проверки новой ревизии только для исправления отступов, а не синтаксиса. Часто первоначальный разработчик больше не имеет учетной записи (они покинули компанию). Если бы я исправил этот отступ, то это изменение было бы отмечено моей учетной записью в выводе cvs annotate, что нежелательно. Поскольку изменяется только отступ, функциональность не изменяется. Конечный результат состоит в том, что, когда файл снова извлекается, его отступы исправляются, и cvs annotate показывает эту строку последнего «реального» изменения и связанного с ним автора.

Итак, возможно ли это даже при прямом редактировании файла RCS ,v (например, в копии файла на заблокированном CVSROOT), или есть контрольные суммы, которые проверяют такое редактирование (Формат RCS ссылается на поле "целостность", но неясно, делает ли это изменение недействительным)? Обратите внимание, что это зависит от CVS; другие системы управления исходным кодом, такие как Git, имеют встроенные механизмы. (Переход на эти другие системы рассматривается, но здесь это не по теме).

https://stackoverflow.com/a/46713192/257924, похоже, указывает на то, что есть инструменты, легко доступные для анализа базового формата RCS (, v файлы), поэтому его можно использовать в качестве основы для этого, если действительно правда, что в файле есть какой-то тип контрольной суммы. Но если бы я мог просто вносить правки напрямую, это было бы лучше.


53
2

Ответы:

Конечно, теоретически возможно переписать файл ревизии RCS на месте. Однако добиться этого на практике довольно сложно. Как ответ, который вы связали примечания, содержимое файла RCS ,v (есть?):

  • последняя версия в багажнике
  • с обратными дельтами для создания каждой более ранней версии ствола
  • но с прямыми дельтами для создания каждой версии ветки

Это означает, что чтобы где-то заменить определенную версию, вы должны:

  1. Найдите его положение в стволе или ответвлении ручья.
  2. Если он находится в магистрали, перезапишите предыдущую дельту магистрали при замене этой конкретной версии магистрали, что может означать переписывание этой дельты или перезапись неповрежденной окончательной версии на месте;
  3. в противном случае (это версия ветви) перепишите последующую дельту, переписав при этом дельту предшественника этой версии, которая ведет к этой версии.

Этот процесс, вероятно, будет довольно подвержен ошибкам.

Гораздо проще просто подделать имя пользователя. Создайте обновленную версию файла и зафиксируйте ее как пользователь, на которого вы намерены возложить ответственность. Если вы контролируете систему, вы контролируете, принимаются ли некоторые учетные данные. В противном случае вы все равно не сможете перезаписать файл ,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, возраст каждого файла будет записан правильно независимо от изменений форматирования.