2013-05-28 38 views
5

Sử dụng TFS, tôi có thân cây $/project/trunk và một chi nhánh $/project/dev/feature/new_one.Tìm đường dẫn tfs của chi nhánh đã hợp nhất

Tôi đã sáp nhập chi nhánh của tôi trở lại thân cây như sau:

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

tôi sử dụng API TFS và có thể tìm thấy C33 merge changeset. Với phương thức QueryMerges(), tôi có thể tìm thấy phụ huynh thay đổi C32 với tất cả các thay đổi trên tệp, nhưng không phải là thông tin tôi cần: (

Có cách nào, sử dụng API TFS, để tìm kho lưu trữ đường dẫn của chi nhánh sáp nhập $/project/dev/feature/new_one?

với changeset C32, tôi chỉ là có thể nhận được đường dẫn của tập tin sửa đổi, giống như $/project/dev/feature/new_one/path/to/file.txt nhưng tôi không thể trích xuất đường dẫn của chi nhánh từ đường dẫn đầy đủ của tập tin :(

PS: Giải pháp hoạt động vì TFS2008 sẽ là tốt nhất, nhưng nếu nó chỉ hoạt động kể từ năm 2010, nó sẽ tốt ...

PS2: giải quyết vấn đề này sẽ giúp quản lý hợp nhất changesets trong git-TFS mà tôi phát triển ...

Trả lời

5

Đáng tiếc là không có phương pháp API để có được một chi nhánh cho một con đường mục nhất định, mà bạn sẽ nghĩ là một trường hợp sử dụng khá phổ biến.

TFS 2010 trở đi bạn có thể sử dụng VersionControlServer.QueryRootBranchObjects để truy vấn tất cả các chi nhánh trong kiểm soát phiên bản. Sử dụng tham số RecursionType.Full làm phương pháp này, bạn sẽ nhận được một mảng BranchObject của tất cả các chi nhánh không có cha mẹ tất cả các hậu duệ của chúng. Sau đó bạn có thể xác định một chi nhánh cho một đường dẫn tập tin cụ thể như sau:

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); 

Như đã trình bày, các đường dẫn đến các chi nhánh ở BranchObject.Properties.RootItem.Item. Tôi tin rằng an toàn khi tìm thấy BranchObject có liên quan trong mảng đơn giản bằng cách kiểm tra đường dẫn của nhánh được chứa trong đường dẫn của tệp hợp nhất (vì nó chỉ có thể khớp với nhiều nhất một nhánh khi TFS thực thi rằng chỉ một nhánh có thể tồn tại trong một thư mục đã cho) hệ thống cấp bậc).

Chỉ cần lưu ý, tôi đã bị đốt cháy bởi this Kết nối vấn đề khi sử dụng QueryRootBranchObjects trong TFS 2012. Nguyên nhân là một số nhánh giả có dấu nháy trong tên chi nhánh.

Cách giải quyết cho vấn đề này là sử dụng VersionControlServer.QueryBranchObjects, tuy nhiên điều này có một mã nhận dạng mặt hàng là đường dẫn chính xác đến chi nhánh. Rõ ràng bạn không biết đường dẫn nhánh tại thời điểm này vì tất cả những gì bạn có là đường dẫn tệp, vì vậy bạn phải recurse up các thư mục của đường dẫn tệp gọi QueryBranchObjects mỗi lần cho đến khi bạn nhận được kết quả phù hợp.

+0

Giải pháp này là dự phòng của tôi nhưng không vui lòng vì 2 lý do: 1. nếu chi nhánh chính không phải là chi nhánh mà vẫn là thư mục trong tfs, bạn có thể lấy nó bằng QueryRootBranchObjects() và không thể tìm thấy nó 2. nếu bạn có nhiều chi nhánh tên dev, dev/test, dev/test2, dev/test3 và trong mã nguồn của bạn, bạn đã có một thư mục 'test' nó có thể thấy rằng nhánh cha tốt là 'dev' và trên thực tế nó là 'dev/test'. Bạn không thể chắc chắn 100%: (Ngay cả khi đó là trường hợp hiếm hoi ... – Philippe

+0

Tôi đã thực hiện chỉnh sửa. 2. Đủ dễ để giải quyết, cộng với không thể có nhánh '$/dev' thì một nhánh khác bên dưới nó ở '$/dev/test', TFS không cho phép điều này ở bước phân nhánh. –

Các vấn đề liên quan