合并Team Foundation Server无基础合并中的删除

时间:2009-09-10 22:23:23

标签: version-control tfs merge

我有两个在TFS中没有直接父/子关系的TFS分支。在某个修订版本中,我的示例中有94个项目被删除了。我的任务是将这些删除应用到主分支。我想通过毫无根据的合并来做到这一点。我尝试了以下命令:

tf merge /baseless /recursive /version:94 .\programs\program1 ..\Release\programs\program1

树中的大多数项目都标记为“合并”,有些项目标记为“合并编辑”。但是,目的地中没有删除任何项目。一时兴起,我试图合并一个删除像这样:

tf merge /baseless /recursive /version:94 .\programs\program1\source1.cs ..\Release\programs\program1\source1.cs

我收到以下错误消息:

The item [TFS_PATH] does not exist at the specified version.

我该怎么做?有没有办法避免自己删除所有这些删除?

3 个答案:

答案 0 :(得分:2)

不,抱歉,不能这样做。无基础合并非常愚蠢,仅仅是“获取文件夹的内容并将其复制到其他地方”。正如Baseless所暗示的那样,没有历史信息可以用来做差异。实际上,这意味着文件内容传播但不会传播命名空间(删除,取消删除,重命名)。你可以通过匹配类似的文件名和交叉手指来对文件内容进行排序,但是区分命名空间确实需要知道上次分支同步时树结构的样子,所以TFS甚至都不会打扰。

也就是说,如果您知道变更集#所需的删除操作,那么自行编写删除脚本并不是很重要。

$tfs = Get-TfsServer -path . -all
$deletes = get-tfschangeset 94 | % { $_.changes } | ? { ($_.changetype -band $tfs.VCS_ChangeType::delete) -ne 0 } | % { $_.serveritem }
($deletes -replace "$/branch1" "$/branch2") | Add-TfsPendingChange -delete 

[未经测试但应该工作]

答案 1 :(得分:2)

我试验了一下,这是我上面的版本。似乎对我有用:

get-tfsChangeset xx |% {$_.changes} |? {($_.changetype -band $tfs.VCS_ChangeType::delete) -ne 0 } |% {$_.item.serverItem -replace "\$/branch1","$/branch2"} |  Add-TfsPendingChange -delete

使它更有用,可以参数化变更集编号和分支路径,以便更方便地处理。

例如,要处理给定分支中的所有删除,请从源位置运行此命令:

$sourcePath="\$/MySourcePath"
$destPath="$/MydestPath"

 Get-TfsItemHistory ./*.sql -r -IncludeItems  | %{$_.changes} |
 ? {($_.changetype -band $tfs.VCS_ChangeType::delete) -ne 0 } |
 % {$_.item.serverItem -replace $sourcePath,$destPath} |  Add-TfsPendingChange -delete

答案 2 :(得分:1)

Patterns & Practices documentation意味着您必须自己解决合并冲突,一次。 (警告:我没试过这个。)

编辑:P.S。另请参阅The morning after a TFS Baseless Merge