Использование 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"
}
Не совсем православный, но должен работать...