【问题标题】:Programmatically delete a TFS branch以编程方式删除 TFS 分支
【发布时间】:2018-06-25 23:46:08
【问题描述】:

我想以编程方式删除 TFS 中自动创建的分支。

有一个现有的方法“ICommonStructureService.DeleteBranches”应该可以完成这项工作。 我的问题是该方法需要一个参数“string[] nodeUris”,该参数指定要使用“vstfs://...” URI 删除的分支,我只是不知道如何为我的分支获取它。

我需要的是这样的:

var projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri <myCollectionUrl>));
var cssService = projectCollection.GetService<ICommonStructureService3>();
var project = cssService.GetProjectFromName(<myProjectName>);

但是我怎样才能从那里获得 Branch Uri?

【问题讨论】:

    标签: tfs tfs-sdk


    【解决方案1】:

    与此同时,我找到了解决方案。删除我正在使用的分支

    versionControl.Destroy(new ItemSpec(myBranchPath, RecursionType.Full), VersionSpec.Latest,  null, DestroyFlags.KeepHistory);
    

    这正是我所需要的。 versionControl 是 VersionControlServer 类型,必须使用 Team Collection 进行初始化

    【讨论】:

    • Destroy?以编程方式?如果要销毁所有内容,为什么还要使用版本控制?
    • 请注意,有可用的 DestroyFlags。 “DestroyFlags.KeepHistory”意味着不是所有的东西都被破坏了,但是历史被保留了。用例是例如以后可能不需要的“临时”分支(以防历史未被破坏)。以编程方式,因为我们有一个封装了许多 TFS 操作的集成环境。
    【解决方案2】:

    删除版本控制中的分支就像删除任何其他版本控制项一样。您需要在Item 上使用Workspace.PendDelete 挂起删除。

    method you reference 与版本控制完全无关,它是 TFS common structure service 的一部分,它控制 TFS 工作项可以分配到的“areas and iterations”。

    简而言之,没有办法对通用结构服务执行任何类型的版本控制操作。您可以通过针对VersionControlServer 创建一个Workspace 来删除一个分支,等待删除,然后签入您的未决更改。

    【讨论】:

    • 感谢您的回答,但是因为有“ICommonStructureService.DeleteBranches”这个方法,所以应该有使用它的选项。
    • 有一个选项可以使用它,但不适用于版本控制分支,用于公共结构服务分支。 http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.server.icommonstructureservice.deletebranches(v=vs.90).aspx.
    • 我不完全理解您所说的“通用结构服务分支”是什么意思。您的链接似乎对我不起作用...
    • 我试图澄清我的答案。如果您有任何问题,请告诉我。
    【解决方案3】:

    我同意 Edward Thomson 关于使用 Destroy 命令的意见。所以我听从了他的建议并想出了以下方法,

    public void DeleteBranch(string path)
    {
        var vcs = GetVersionControlServer();
        var itemSpec = new ItemSpec(path, RecursionType.Full);
        var itemSpecs = new[] {itemSpec};
        var workSpace = GetOrCreateWorkSpace(vcs);
        try
        {
            workSpace.Map(path, @"c:\Temp\tfs");
            var request = new GetRequest(itemSpec, VersionSpec.Latest);
            workSpace.Get(request, GetOptions.GetAll | GetOptions.Overwrite);
            workSpace.PendDelete(path, RecursionType.Full);
            var pendingchanges = workSpace.GetPendingChanges(itemSpecs);
            workSpace.CheckIn(pendingchanges, "Deleting The Branch");
        }
        finally
        {
            if (workSpace != null)
            {
                workSpace.Delete();
            }
        }
    }
    

    如果有一种巧妙的方法可以做到这一点,我很期待。这有点慢,因为它做了太多事情,

    • 创建临时工作区
    • 获取所有更改
    • 对整个变更集执行删除
    • 签入
    • 清理工作区

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多