Move и Rename являются псевдонимами. В любой версии TFS нет абсолютно никаких отличий от командной строки или пользовательского интерфейса.
Оба они сохраняют историю. По крайней мере, в 2005/2008 году вы сохраняете один и тот же физический элемент в таблице VersionedItem, независимо от того, как часто или как сильно меняется имя и / или родительский путь. На самом деле нет никакого способа получить «поддельное» переименование (удалить + добавить) без большой ручной работы с вашей стороны.
Однако, хотя эта модель управления версиями очень чиста в теоретическом смысле, она имеет некоторые практические ошибки. Поскольку разные элементы могут занимать одно и то же имя в разные моменты времени, TFS требуется полное имя + версия, чтобы однозначно идентифицировать любые отправляемые вами входные данные. Обычно вы не замечаете это ограничение, но как только вы переименуете элементы в системе, если вы скажете tf [doSomething] $ / newname -version: oldversion , тогда он запутается и либо выдаст ошибку, либо работать с предметом, который вы, возможно, не предполагали. Вы должны быть осторожны при передаче допустимых комбинаций (newname + newversion или oldname + oldversion), чтобы гарантировать, что команды ведут себя так, как вы хотите.
TFS 2010 несколько меняет историю: это ветка + удаление под обложками, что приводит к изменению itemID. Несмотря на это, повседневные команды, такие как Get и History, «подделаны» очень хорошо; старые клиенты совместимы на 95%. Преимущество состоит в том, что, когда в системе несколько переименований, и поиск элементов на основе пути начинает становиться неоднозначным, как указано выше, сервер просто примет указанное вами имя и будет работать с ним. Это повышает общую производительность системы и устраняет несколько ловушек, в которые часто попадают незнакомые пользователи, за счет того, что они не настолько гибки и не сохраняют историю со 100% точностью (например, когда возникают конфликты имен во время слияния двух ветвей).
Возвращаясь к проблеме под рукой ...
Это не так просто, как сказать tf переименовать $ / projectA $ / projectB . Папки верхнего уровня в дереве исходного кода зарезервированы для мастера создания командного проекта; Вы не можете запускать стандартные команды 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 предполагают версию = «последний». Любая из этих альтернатив будет полная история, которую вы хотите:
- tf history $ / ProjectA / somefile.cs; 1234 , где набор изменений 1234 был до переезда
- tf history $ / ProjectB / somefile.cs; 5678 , где changeset 5678 был после перемещения. Или вы можете просто опустить версию.
Последняя альтернатива для полноты и отладки:
- tf history $ / ProjectA / somefile.cs -slotmode . Вы увидите только те изменения, которые произошли до переезда; однако вы также увидите историю любых других элементов, которые могли находиться в «слоте» $ / ProjectA / somefile.cs до или после элемента, который вы переместили под B.
(В TFS 2010 "режим слота" является поведением по умолчанию; есть опция -ItemMode, чтобы запросить, чтобы ваш поиск отслеживался по истории, как это было в 2008 году, а не по пути.)
РЕДАКТИРОВАТЬ - нет, ветвление не является хорошей альтернативой. Хотя ветвление оставляет достаточно метаданных в системе для отслеживания полной истории в ProjectB и из ProjectB, это не очень удобно для пользователя в 2008 году. Планируйте потратить много времени на изучение команды tf merges (без эквивалента пользовательского интерфейса) , В 2010 году значительно улучшена ваша способность визуализировать изменения в нескольких ветвях, но это по-прежнему непростая единая среда, которую вы получили бы от переименования.