2014-01-14 44 views
21

是否可以通過tfs/tfpt中的某些操作從一個分支的兩個版本的差異創建一個shelveset?將變更集轉換爲擱置集

例如從(changeset 2013 - > changeset 2034)創建shelveset

+0

什麼是你想用這個來完成?可能有更好的方法來實現你的目標。 –

+0

@DanielMann,我試圖把我得到的架子應用到另一個分支。我不想要一個無基礎的合併,太多標記爲合併的文件。 – orange

回答

4

不,這是不可能的。更改集和擱置集是不同的東西,具有不同的目的。你也許可以寫一個插件來做你正在做的事情(檢索變更集,檢查文件,擱置文件)。

+0

這是可能的。看到我的答案。 – zumalifeguard

74

可以根據變更集創建一個shelveset,但有一些限制。我需要從一個分支回滾一個更改以將其從一個版本中刪除,但它不在任何其他分支中,所以我想將更改保留在一個擱置集合中。我做到這一點如下:

  • 回滾變更集並檢查回滾。
  • 回滾回滾更改集。這給了我一組包含原始更改的未決更改。
  • 擱置待處理的更改。

您可以將此技術應用於問題中描述的情況,但這將需要大量的人工努力,因爲它必須對每個變更集重複使用。它也會在TFS中產生很多混亂,因爲你必須檢查回滾的回滾。

+5

@orange:你爲什麼不把它作爲正確的答案?它解決了你的問題。 – floquet22

+0

我剛剛發現了一個使用Git-TFS的工作流程,可以讓你做到這一點。我希望明天發佈一個答案。這不是人們要求的100%,但它不涉及如此不協調的工作流程。 –

1

雖然此解決方案不涉及純粹的TFS解決方案,但它並不涉及TFS變更歷史記錄,例如Lee Richardson的答案。

您可以使用Git-TFS克隆TFS倉庫或分支,然後創建一個新的分支先前的承諾(TFS簽入),從一個新的提交重新申請變更和發佈,作爲一個擱置:

  1. 看在git log爲您要創建一個變更的一個前提交:

    $ git log --oneline 
    
    AAAAAAA Newest commit 
    BBBBBBB The commit for which I want a shelveset 
    CCCCCCC The commit where I will create a new branch from 
    
  2. 創建一個新的分支從承諾要追溯創建擱置在一個之前發生的:

    $ git checkout -b CCCCCCC 
    
  3. 結帳從提交您要創建擱置的變化:

    $ git checkout BBBBBBB -- . 
    
  4. 提交這些籌備的文件:

    $ git commit -m "Committing stuff for a retroactive shelveset that does X, Y and Z." 
    
  5. 創建擱置:

    $ git tfs shelve my_retroactive_shelveset HEAD 
    

優勢

  • 這使TFS變更歷史清潔,而不需要您還原一個變更,創建一個擱置於未恢復之前恢復變更。

  • 由於擱置從Git中的一個分支創建,您可以刪除該分支,同時確保自己的Git,TFS歷史乾淨爲好。

缺點

  • 它不是一個純粹的TFS解決方案
0

這不是不可能的。從技術上講,你可以做到,儘管你可能不想。我會讓讀者決定。

您可能想在新的工作區中執行此操作。

  1. 獲取變更集的問題(新代碼)
  2. 將所有源temp文件夾。 (不要移動$ tf文件夾)。源樹現在應該是空的。
  3. 獲取以前的Changeset。
  4. 鏡像拷貝新的代碼之上的老
  5. 做一個和解。現在

您可以創建擱置。

如果你能夠將精力集中到特定的文件夾,然後它會走得更快,並且可以自動執行它。這裏有一些可以做到這一點的示例命令行。我只是試了一下,它爲我工作。

在本例中,我指向一個文件夾從稱爲「源」的根。將其更改爲根文件夾。

md tmpws 
cd tmpws 
tf vc workspace /new /noprompt tmpws /location:local /permission:private 

tf vc get "$/Src" /version:C2222 /recursive /noprompt 

cd .. 
md tmp 
move "tmpws\Src" tmp 

cd tmpws 
tf vc get "$/Src" /version:C1111 /recursive /noprompt /force /overwrite 

cd .. 
robocopy "tmp\Src" "tmpws\Src" /mir 

tf vc reconcile /promote /adds /deletes /diff /recursive /noprompt 

tf vc shelve /replace /noprompt mychange 

tf vc undo "$/Src" /recursive /noprompt 
tf vc workspace /delete tmpws 

cd .. 
rmdir /q /s tmp 
rmdir /q /s tmpws