Используя Subversion, как я могу вырезать из одного файла и вставить в другой, сохраняя историю - PullRequest
14 голосов
/ 13 октября 2009

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

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

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

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

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

Ответы [ 4 ]

17 голосов
/ 13 октября 2009

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

svn merge sourcefile targetfile -r 0:HEAD

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

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

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

4 голосов
/ 13 октября 2009

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

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

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

1 голос
/ 13 октября 2009

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

svn mv

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

svn copy

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

# copy/paste with a text editor

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

svn del

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

0 голосов
/ 13 октября 2009

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

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

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

...