2014-01-14 40 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