2013-05-28 3 views
5

Используя TFS, у меня есть багажник $/project/trunk и ветка $/project/dev/feature/new_one.Найти путь tfs объединенной ветки

Я слил свою ветку обратно в ствол следующим образом:

C33($/project/trunk) 
| \ 
| \ 
| C32($/project/dev/feature/new_one) 
|  | 
|  | 
|  | 
... 

Я использую API TFS и могу найти слияние C33 набора изменений. С помощью метода QueryMerges(), я смог найти родительский C32 с набора изменений всех изменений на файлы, но не информация мне нужна :(

Есть ли способ, с помощью API TFS, чтобы найти хранилище путь ветви сливались $/project/dev/feature/new_one?

с ревизией C32, я только смог получить пути измененных файлов, как $/project/dev/feature/new_one/path/to/file.txt, но я не в состоянии извлечь путь ветви из полного пути к файлу :(

PS: Решение, работающее с TFS2008, будет лучшим, но если оно работает только с 2010 года, оно должно быть хорошим ...

PS2: решение этой проблемы поможет управлять слияния в Git ревизии-ТПО, которые я разрабатываю ...

ответ

5

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

TFS 2010 г. вы можете использовать VersionControlServer.QueryRootBranchObjects для запроса всех ветвей в управлении версиями. Используя RecursionType.Full в качестве параметра этого метода, вы получите массив BranchObject всех ветвей без родителя и все их потомки. Вы можете определить ветвь для данного пути к файлу следующим образом:

var collection = new TfsTeamProjectCollection(new Uri("http://tfsuri")); 
var versionControl = collection.GetService<VersionControlServer>(); 

var branchObjects = versionControl.QueryRootBranchObjects(RecursionType.Full); 

var mergeFilePath = "$/project/dev/feature/new_one/path/to/file.txt"; 
var branch = branchObjects.SingleOrDefault(b => { 
      var branchPath = b.Properties.RootItem.Item; 
      return mergeFilePath.StartsWith(branchPath.EndsWith("/") ? branchPath : branchPath + "/"); 
     }); 

Console.WriteLine(branch.Properties.RootItem.Item); 

Как показано, путь к ветви на BranchObject.Properties.RootItem.Item. Я считаю, что безопасно найти релевантный BranchObject в массиве, просто проверив, какой путь ветви содержится в пути файла слияния (учитывая, что возможно только совпадение не более одной ветви, поскольку TFS принудительно устанавливает, что в данной папке может существовать только одна ветвь иерархии).

Только для того, чтобы быть в курсе, меня сожгли this Соедините вопрос при использовании QueryRootBranchObjects в TFS 2012. Причиной были некоторые ложные ветви, у которых были апострофы в имени ветки.

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

+0

Это решение является моим резервным, но это не радует меня по двум причинам: 1. Если ваша родительская ветка не является веткой, но все еще является папкой в ​​tfs, вы можете получить ее с помощью QueryRootBranchObjects() и не можете найти его 2. Если у вас есть несколько названий ветвей dev, dev/test, dev/test2, dev/test3, и в вашем исходном коде у вас есть папка «test», она может обнаружить, что хорошая родительская ветвь - это «dev», и на самом деле это был «dev/test». Вы не можете быть уверены в том, что 100% :(Даже если это редкие случаи ... – Philippe

+0

Я сделал редактирование. 2. Достаточно легко решить, плюс не возможно иметь ветку '$/dev', затем другую ветвь ниже его в '$/dev/test'. TFS не позволяет это на этапе ветвления. –