将变更集转换为搁置集

时间:2014-01-14 23:28:16

标签: tfs changeset shelveset

是否可以通过tfs / tfpt中的某些操作从一个分支的两个版本的diff中创建一个shelveset?

e.g。从(changeset 2013 - > changeset 2034)

创建一个shelveset

5 个答案:

答案 0 :(得分:87)

可以从变更集创建搁置集,但有一些限制。我需要从分支回滚一个更改以从发布中删除它,但它不在任何其他分支中,所以我想在搁置集中保留更改。我实现了如下:

  • 回滚变更集并检入回滚。
  • 回滚回滚变更集。这给了我一组包含原始更改的待定更改。
  • 搁置待处理的更改。

您可以将此技术应用于问题中描述的案例,但这将是大量的手动工作,因为它必须针对每个变更集重复。它也会在TFS中产生很多混乱,因为你也必须检查回滚的回滚。

答案 1 :(得分:4)

不,这是不可能的。变更集和搁置集是不同的东西,具有不同的目的。您可以编写一个插件来执行您所需的操作(检索更改集,检出文件,搁置文件)。

答案 2 :(得分:1)

虽然这个解决方案并不涉及纯粹的TFS解决方案,但它并没有像李理查森的回答那样涉及TFS变更集历史。

您可以使用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. 从您要为其追溯创建shelveset的提交之前的提交创建一个新分支:

    $ 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. 创建shelveset:

    $ git tfs shelve my_retroactive_shelveset HEAD
    
  6. <强>优点

    • 这样可以保持TFS变更集历史记录清晰,而无需还原变更集,创建搁置集以取消恢复以前还原的变更集。

    • 由于shelveset是从Git中的分支创建的,因此您可以删除该分支并保持Git-TFS历史记录清洁。

    <强>缺点

    • 它不是纯粹的TFS解决方案

答案 3 :(得分:1)

这不是不可能的。从技术上讲,你可以做到,尽管你可能不想这样做。我会让读者决定。

您可能希望在新工作区中执行此操作。

  1. 获取有问题的变更集(新代码)
  2. 将所有源移动到临时文件夹。 (不要移动$ tf文件夹)。源树现在应该是空的。
  3. 获取上一个变更集。
  4. 镜像复制旧代码
  5. 上的新代码
  6. 做一个和解。
  7. 现在您可以创建Shelveset。

    如果您能够专注于特定文件夹,那么它会更快,您可以自动化它。这是执行此操作的示例命令行。我刚尝试过,它对我有用。

    在这个例子中,我指向一个名为“Src”的根文件夹。将其更改为根文件夹。

    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
    

答案 4 :(得分:1)

每次提交都会创建一个架子集。因此,我们可以找到在启动提交时创建的架子集。那将有完全相同的变化。我们不需要创建新的货架集。