Пример:
$ svn copy foo.txt bar.txt
A bar.txt
<foo.txt>
, сохраняя при этом ее историю для совместного использования с <bar.txt>
?<bar.txt>
, что будет с <foo.txt>
?Какие эквиваленты этому есть в других современных системах (Clearcase, Accurev, Perforce)?
Позвольте мне подчеркнуть то, что я ищу:
Есть ли такое разветвление на уровне файлов?
Что произойдет, если вы используете его в той же ветке, то есть создадите копию файла, а затем начнете изменять этот новый файл. все в одной ветке?
Я понимаю, что он также используется для тегирования, но меня интересует, чего ожидать при выполнении <svn copy>
на уровне файлов.
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 withbar.txt
?
Не совсем так, история foo.txt
будет эффективно скопирована в историю bar.txt
, затем в истории bar.txt
появится дополнительная запись, указывающая, что она была скопирована с foo.txt
, и после этого они независимы. Таким образом, история до момента копирования идентична / разделяется.
If I'm changing
bar.txt
, what will happen tofoo.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. Затем я изменяю оба файла и удаляю из каждого неподходящие биты. Таким образом, оба новых файла сохраняют историю изменений для своих соответствующих битов.