Какое использование svn copy?

Пример:

$ svn copy foo.txt bar.txt  
A    bar.txt
  • Когда бы вы использовали эту технику и почему?
  • Будет ли эта команда (взятая из "красной книги" svn) создавать копию <foo.txt>, сохраняя при этом ее историю для совместного использования с <bar.txt>?
  • Если я заменю <bar.txt>, что будет с <foo.txt>?

Какие эквиваленты этому есть в других современных системах (Clearcase, Accurev, Perforce)?

Позвольте мне подчеркнуть то, что я ищу:
Есть ли такое разветвление на уровне файлов?
Что произойдет, если вы используете его в той же ветке, то есть создадите копию файла, а затем начнете изменять этот новый файл. все в одной ветке?
Я понимаю, что он также используется для тегирования, но меня интересует, чего ожидать при выполнении <svn copy> на уровне файлов.


27
25 157
7

Ответы:

When would you use this technique, and why?

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

Will this command create a copy of foo.txt while preserving the history of it to be shared with bar.txt?

Не совсем так, история foo.txt будет эффективно скопирована в историю bar.txt, затем в истории bar.txt появится дополнительная запись, указывающая, что она была скопирована с foo.txt, и после этого они независимы. Таким образом, история до момента копирования идентична / разделяется.

If I'm changing bar.txt, what will happen to foo.txt?

Ничего, они совершенно отдельные. Но позже вы можете объединить изменения от одного к другому.


Я использую эту технику, когда создаю новый файл и хочу скопировать скаффолдинг (в настоящее время я использую Perforce, но раньше использовал Subversion). Изменение копии не повлияет на другой файл.


What are the equivalents to this in other modern systems (Clearcase, Accurev, Perforce)?

git заметит, что файл такой же, как на простой копии, и покажет его как копию.


Решено

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

Кстати: это одна из немногих функций, которые есть у SVN, но у Git нет (Git попытается угадать происхождение кода постфактум, особенно если вы добавите -C в команды).


Branch - это не первоклассный гражданин Subversion, поскольку он «реализован» как каталог.

Следовательно, svn copy позволяет создавать ветвь файла в одной ветке (каталоге). Позже вы можете объединить скопированный файл с первым. Но это не подходит только для одного файла, как указано в эта ветка

Эквивалентом в ClearCase будет правило выбора, например

element * .../myBranchForCopy/LATEST
element /myPath/myFile /main/myBranch/LATEST -mkbranch myBranchForCopy

Однако в этом представлении, предназначенном для разветвления файла, вы будете видеть только один foo.txt за раз (либо в myBranch, либо, если он извлечен, в myBranchForCopy). Настоящей «копии» нет, это тот же элемент. Любое слияние будет между:

  • foo.txt@@/main/myBranch/myBranchForCopy/LATEST
    и
  • foo.txt@@/main/myBranch/LATEST

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


svn copy пригодился после того, как я случайно удалил файл. См. ответ к соответствующему вопрос, который я спросил.