我有两个在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.
我该怎么做?有没有办法避免自己删除所有这些删除?
答案 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。