Использование Subversion, как я могу вырезать из одного файла и вставлять в другую историю сохранения

Ситуация заключается в том, что я потратил некоторое время на использование экспериментального кода. Теперь я хочу переместить часть этого кода - около 500 строк - в другой файл, но я не хочу потерять историю, как если бы я делал простой текстовый редактор, вырезал и вставлял.

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

Причина, по которой это важно, в основном состоит в том, что код - это всего лишь довольно специализированный материал, чтобы помочь реализовать некоторые функции более высокого уровня. Я не хочу, чтобы он загрязнял глобальные пространства имен, поэтому я хочу все это в одном файле, где он будет использоваться и завернут в анонимное пространство имен.

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

В основном я использую TortoiseSVN, но также установлен подрывная программа командной строки.

Ответ 1

Вы можете объединить все ревизии (или конкретные изменения) одного файла в другой, как этот

svn merge sourcefile targetfile -r 0:HEAD

Сначала мне показалось, что нужно использовать параметр --ignore-ancestry (так как оба файла не имеют общей истории), но, по-видимому, это необязательно. Я тестировал svn 1.6.3.

Конечно, вы, скорее всего, получите много маркеров конфликтов в результате слияния. Может быть проще выполнить слияние вручную (скопируйте и вставьте слияние, как вы говорите), а затем запустите указанную выше команду слияния с помощью --record-only, чтобы сообщить об этом подражание.

После слияния targetfile будет иметь свойство svn:mergeinfo, которое указывает, кто из sourcefile совершает объединение, сливаясь с ним. Когда вы просматриваете журнал targetfile, вы можете просмотреть историю обоих файлов с помощью параметра --use-merge-history. TortoiseSVN имеет такую ​​же функцию в виде флажка в форме журнала.

Ответ 2

Я не думаю, что вы можете сохранить историю так, как вы описываете. SVN отслеживает историю по файловому принципу и не будет отслеживать два отдельных файла, которые объединены вместе на одной и той же строке кода.

Если вы начали с двух отдельных файлов, а затем объедините их в одну треть, история обоих будет сохранена. Если вы объедините один в другой, история одного из них будет "потеряна" в том смысле, что вы не сможете ссылаться на историю "удаленного" файла, просто глядя на историю.

Я предполагаю, что вы можете сделать это в сообщении о фиксации, просто обратите внимание, что содержимое из другого файла было объединено, а затем зафиксировать удаление в том же коммите.

Ответ 3

Если вы хотите скопировать в новый файл и удалить старый файл:

svn mv

Если вы хотите дублировать в новом файле:

svn copy

Если оба файла уже существуют:

# copy/paste with a text editor

Вы можете удалить файл, сохранив его историю:

svn del

С SVN вы не можете отслеживать историю слияния двух файлов. Вы можете объединить его вручную и сохранить трассировку в сообщении фиксации.

Ответ 4

Не можете ли вы оставить код в собственном файле (после обрезки частей, которые вы не хотите сохранить) и включить этот файл в ваш "настоящий" исходный файл?

// file foo.cpp:
...
namespace {
#  include "util_code.inc"
}

Не совсем православный, но должен работать...