Перемещение метода из одного файла в другой с сохранением его истории

#svn #version-control

#svn #контроль версий

Вопрос:

Недавно я перенес метод из одного класса / файла в другой, чтобы иметь возможность использовать его повторно. Теперь, если я обвиняю через subversion, я несу ответственность за все строки кода, что имеет смысл, поскольку я создал новый файл.

Есть ли какой-либо способ заставить subversion распознать, откуда взялся этот метод, чтобы сохранить историю без изменений?

Ответ №1:

Если вы переместили функцию из одного существующего файла в другой существующий файл, я думаю, короткий ответ будет: «Это невозможно сделать». Если вы переместили функцию из существующего файла в новый файл, т. Е. создали новый файл только для хранения этой функции (возможно, добавив что-то еще, но начиная с этой функции), тогда вы могли бы скопировать файл, удалить функцию из оригинала и удалить все, кроме функции, из копии. Тогда и оригинал, и копия сохраняли бы историю.

Комментарии:

1. Спасибо, Джей, похоже, я мог бы отказаться от сохранения истории для этого одного метода, но если туда переместится больше материала, то возникнет та же проблема. Интересно, возможно ли что-то подобное в Mercurial или Git, где он мыслит в терминах изменений, а не изменений для каждого файла. На данный момент моим решением будет просто отпустить историю. Я всегда могу отследить изменение, при котором метод был удален, и обвинить его оттуда.

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

Ответ №2:

Для каждого файла нет истории. Subversion просто знает, что это файл, полный текста; он не анализирует текст, чтобы понять, что это такое.

Ответ №3:

Если вы действительно хотите сохранить историю нетронутой, вы могли бы использовать svn cp для создания копии, которая затем редактируется отдельно.

Но я никогда этого не делал и не думаю, что когда-нибудь сделаю. Единственная причина, по которой я сделал бы что-то подобное, была бы для файла, который полностью разделен на части, а не для метода, который перемещается из одного файла в другой.

Вместо этого я бы использовал значимый комментарий проверки: что-то вроде «foo создан путем извлечения bar из baz»

Ответ №4:

Под историей — вы имеете в виду историю «за строку», например, из «svn blame»?

Добавить комментарий:

 /** Moved from {@link OldClass}. */
  

и убедитесь, что оба класса (новый и старый) возвращены в одну и ту же ревизию. Если кому-то действительно не все равно, они могут прочитать комментарий и сказать, что «svn винит» старый класс.