Перемещение и переименование - это псевдонимы. В любой версии TFS нет никакой разницы из командной строки или пользовательского интерфейса.
Оба они сохраняют историю. По крайней мере, в 2005/2008 году вы сохраняете один и тот же физический элемент в таблице VersionedItem независимо от того, насколько часто или насколько сильно изменяется имя и/или родительский путь. На самом деле нет способа получить «поддельное» переименование (удалить + добавить) без большой ручной работы с вашей стороны.
Однако, хотя эта модель управления версиями очень чиста в теоретическом смысле, она имеет некоторые практические ошибки. Поскольку разные элементы могут занимать одно и то же имя в разные моменты времени, TFS требуется полное имя + версия, чтобы однозначно идентифицировать любые входы, которые вы отправляете. Обычно вы не замечаете этого ограничения, но как только вы переименовали элементы в системе, если вы скажете tf [doSomething] $/newname -version: oldversion, тогда он запутается и либо выбросит ошибку, либо начнет работать с элементом вы, возможно, не планировали. Вы должны быть осторожны, чтобы передавать действительные комбинации (newname + newversion или oldname + oldversion), чтобы обеспечить поведение команд так, как вы хотите.
TFS 2010 несколько изменил историю: это ветка + удалить под обложками, в результате чего элемент ID изменится. Тем не менее, ежедневные команды, такие как Get и History, «подделаны» очень хорошо; старые клиенты примерно на 95% совместимы. Преимущество состоит в том, что когда у вас есть несколько переименований в системе, и поиск на основе пути начинает становиться двусмысленным, как указано выше, сервер просто примет имя, которое вы укажете и запустите с ним. Это улучшает общую производительность системы и устраняет несколько ловушек, к которым часто приходили незнакомые пользователи, ценой не столь гибкой и не сохраняющей историю со 100% -ной точностью (например, при столкновении имен при слиянии двух ветвей).
Возвращаясь к проблеме под рукой ...
Это не так просто, как сказать ТФ переименовывать $/Projecta $/projectB. Папки верхнего уровня в дереве управления версиями зарезервированы для мастера создания Team Project; вы не можете запускать стандартные команды tf против них. Что вам нужно, это сценарий, как:
Get-TfsChildItem $/ProjectA |
select -Skip 1 | # skip the root dir
foreach {
tf rename $_.serveritem $_.serveritem.replace("$/ProjectA", "$/ProjectB")
}
[конечно, вы можете сделать это вручную, если не слишком много детей в возрасте до $/ProjectA]
Что касается подводных камней, которые я упоминал, Я расскажу об этом прямо сейчас, так как поиск старой истории кажется очень важным для вас. После того, как вы проверите переименование, tf history $/ProjectA/somefile.cs НЕ будет работать. По умолчанию команды tf предполагают версию = «последняя». Любой из этих вариантов будет полная история вы хотите:
- ТФ история $/Projecta/somefile.cs; 1234 где 1234 был ревизии до переезда
- ТФ история $/ProjectB/somefile.cs ; 5678, где сменой 5678 было после переезда. Или вы можете просто опустить версию.
Окончательный вариант для полноты & целей отладки:
- ТФ история $/ProjectA/somefile.cs -slotmode. Вы увидите только изменения, произошедшие до переезда; однако вы также увидите историю любых других предметов, которые могли прожить в слоте $/ProjectA/somefile.cs «до или после предмета, который вы переместили под B.
(В TFS 2010 , режим «слот» - это поведение по умолчанию, есть опция -ItemMode, чтобы запросить отслеживание вашего поиска в истории, как это было в 2008 году, а не на основе пути.)
EDIT - нет, ветвление - отличная альтернатива. В то время как ветвление оставляет достаточно метаданных в системе, чтобы проследить всю историю до & от ProjectB, в 2008 году это не очень удобно. Планируйте потратить много времени на обучение tf, объединяет команду (эквивалент UI). 2010 значительно улучшает вашу способность визуализировать изменения в нескольких ветвях, но это все еще не чистый унифицированный опыт, который вы получите от переименования.
Вау, Ричард. Абсолютно фантастическая информация. Я постараюсь это в моей тестовой лаборатории завтра. Вы упоминали сценарии, потому что корень зарезервирован Если я делал переименование из папки, которая была ниже уровня корня, я мог бы опустить скрипт, а затем - правильно? В любом случае - удивительный ответ. Спасибо за ваше время! –
Да. Основная идея - переименовать ProjectA \ folder1 -> ProjectB \ folder1, ProjectA \ folder2 -> ProjectB \ folder2 и т. д. Сценарий просто позволяет сэкономить время и усилия, если у вас есть 50 файлов и папок. –
Отлично. Большое вам спасибо за то, и легко понимать! –