TFS không nhất thiết phải xây dựng các ứng viên hợp nhất dựa trên các đối tượng nhánh để tương thích ngược (đối tượng chi nhánh mới trong TFS 2010) và hỗ trợ hợp nhất vô căn cứ (một khi bạn thực hiện kết hợp không căn cứ giữa hai đường dẫn, chúng sẽ được lưu trữ với Tôi muốn đề xuất sử dụng chính sách đăng ký tùy chỉnh ở đây để thực thi việc hợp nhất đó đi từ Dev -> Test hoặc Test -> Dev và không bỏ qua cấp trung gian. Điều này cũng cho phép bạn giữ Dev như một đối tượng chi nhánh, do đó bạn sẽ vẫn có được tất cả các tính năng đẹp như hình ảnh hóa chi nhánh.
Tôi có thể cung cấp một ví dụ rất sơ sài, rất giả về những gì tôi có trong đầu. (Đó là thô cả bởi vì tôi lười biếng và bởi vì tôi dành thời gian của tôi trong SDK Java và không NET SDK. Và tôi nhận ra rằng hầu hết mọi người muốn có một chính sách đăng ký .NET. Nhưng chủ yếu là vì tôi lười biếng.)
/*
* Create a dictionary of merge targets to allowable merge sources.
* For an item in this list, the allowable merge sources are a whitelist.
*/
private readonly Dictionary<String, List<String>> restrictedMergeTargets =
new Dictionary<String, List<String>>();
public static MergeWhitelistPolicy
{
/* Only allowed merges to $/Main from $/Test. */
List<String> mainWhitelist = new List<String>();
mainWhitelist.add("$/Test");
allowedMerges.put("$/Main", mainWhitelist);
/* Only allow merges to $/Test from $/Dev. */
List<String> testWhitelist = new List<String>();
testWhitelist.add("$/Dev");
allowedMerges.put("$/Test", testWhitelist);
}
public PolicyFailure[] evaluate(PolicyContext context)
{
PendingChange[] pendingChanges = GetPendingCheckin().GetCheckedPendingChanges();
foreach(PendingChange change : pendingChanges)
{
if(! change.IsMerge())
{
continue;
}
foreach(KeyValuePair<String, List<String>> restrictedTarget : restrictedMergeTargets)
{
if(VersionControlPath.IsChild(restrictedTarget.GetKey(), change.GetServerItem())
{
/* Whitelisted merge path - investigate. */
foreach(String allowedSource : restrictedTarget.GetValue())
{
foreach(MergeSource mergeSource : change.GetMergeSources())
{
if(! VersionControlPath.IsChild(allowedSource, mergeSource.GetServerItem()))
{
return new PolicyFailure("Merge from " +
mergeSource.GetServerItem() + " to " +
change.GetServerItem() + " is disallowed.");
}
}
}
}
}
}
return null;
}
Có một số vấn đề với điều này, tất nhiên. Bạn chắc chắn sẽ không muốn mã hóa danh sách các mối quan hệ hợp nhất có thể chấp nhận được vào chính sách - bạn có thể chuyển nó thành tệp cấu hình hoặc bạn có thể truy vấn các mối quan hệ hợp nhất trên máy chủ và lưu chúng nếu bạn có các quy tắc cụ thể như chỉ con cháu trực tiếp hợp nhất. (Caching điều này rất quan trọng vì việc đánh giá chính sách thường xuyên chạy và được dự kiến là nhanh. Nó thậm chí có thể chạy thỉnh thoảng trên giao diện người dùng (mặc dù tôi nghi ngờ nó), vì vậy số dặm của bạn có thể thay đổi.)
Ngoài ra, đường dẫn thử nghiệm mã là khá cẩu thả, chủ yếu là chỉ để tiết kiệm một số không gian trong bình luận của tôi. (Và ngoài ra, sự lười biếng nói trên của tôi.)
Tôi hy vọng đây là một khởi đầu tốt.
Nguồn
2012-01-09 15:06:57
Khi bạn nói nó không hoạt động, bạn có nhận được thông báo lỗi không? Tôi đã làm điều này gần đây và nó đã cho tôi quá, xem "workaround" ở đây - http://connect.microsoft.com/VisualStudio/feedback/details/503673/it-should-be-possible-to-change-branch-relationships -in-tfs-sau-chúng-được-tạo ra. Bạn có thể sử dụng tùy chọn "Chuyển đổi sang thư mục", như bạn có vẻ đã làm như vậy có thể không phải vậy - nó làm việc cho tôi vì vậy tôi muốn được nghe những gì đã xảy ra. – dash
@dash Khi tôi sử dụng "chuyển đổi sang thư mục", biểu tượng thay đổi nhưng mối quan hệ vẫn còn. I E. Tôi vẫn có thể hợp nhất thư mục với nhánh gốc của nó và giao diện người dùng hợp nhất vẫn hiển thị 2 mối quan hệ. Tôi cũng nên đề cập rằng dự án nhóm này gần đây đã được nâng cấp từ TFS 2008 lên TFS 2010 –