2009-09-10 67 views
3

我有兩個TFS分支在TFS中沒有直接的父/子關係。在我的例子中的某個版本中,有94個被刪除。我一直負責將這些刪除應用到主分支。我想通過一個毫無根據的合併來做到這一點。我想下面的命令這樣做:合併Team Foundation Server無基礎合併中的刪除

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

大部分樹的項目被標記爲「合併」,有的被標記爲「合併編輯」。但是,沒有任何項目在目的地被刪除。心血來潮我試圖合併在一個單一的刪除,像這樣:

​​3210

,我得到了以下錯誤消息:

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

我該怎麼辦呢?有沒有辦法避免自己刪除所有這些刪除?

回答

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

不,不好意思,不能做。無基本的合併非常愚蠢,僅僅是「獲取文件夾的內容並將其複製到其他位置」。正如Baseless的名字所暗示的那樣,沒有任何歷史信息可以用來進行區分。實際上,這意味着文件內容會傳播,但不會更改名稱空間(刪除,取消刪除,重命名)。您可以通過匹配相似的文件名並跨越手指來分類diff文件內容,但是區分名稱空間確實需要知道上次分支同步時樹形結構的樣子,因此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

你忘了在替換命令逗號(或條款或任何其所謂的)。我仍在調試它。 – 2009-09-11 16:33:47

+0

謝謝,隨時編輯我的文章,當你有它的工作。 – 2009-09-11 17:18:59

+0

理查德, 我沒有這個名聲。我正在努力。 – 2009-09-12 01:42:52

相關問題