【问题标题】:Convert changeset(s) to shelveset将变更集转换为搁置集
【发布时间】:2014-01-14 23:28:16
【问题描述】:

是否可以仅通过 tfs/tfpt 中的一些操作从一个分支的两个版本的差异中创建一个搁置集?

例如从(变更集 2013 -> 变更集 2034)创建一个搁置集

【问题讨论】:

  • 你想用这个来完成什么?可能有更好的方法来实现您的目标。
  • @DanielMann,我正试图把我拿到的架子上申请到另一个分支。我不想要一个毫无根据的合并,太多的文件被标记为合并。

标签: tfs changeset shelveset


【解决方案1】:

不,这是不可能的。变更集和搁置集是不同的东西,具有不同的目的。您可能可以编写一个插件来完成您所追求的事情(检索变更集、检查文件、搁置文件)。

【讨论】:

  • 有可能。看我的回答。
【解决方案2】:

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

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

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

【讨论】:

  • @orange:你为什么不把这个作为正确答案?它解决了你的问题。
  • 我刚刚找到了一个使用 Git-TFS 的工作流,它允许您执行此操作。希望明天我会发布答案。这不是人们要求的 100%,但它不涉及如此不稳定的工作流程。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    1. 获取相关变更集(新代码)
    2. 将所有源移动到临时文件夹。 (不要移动 $tf 文件夹)。源树现在应该是空的。
    3. 获取上一个变更集。
    4. 将新代码镜像复制到旧代码之上
    5. 进行协调。

    现在您可以创建搁置集了。

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

    在本例中,我从根目录指向一个名为“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
    

    【讨论】:

    • 谢谢!我使用了这种方法,但为它创建了一个新的工作区,以确保我不会在常规工作区中意外混淆任何东西。然后使用 TFS 电动工具 (tfpt unshelve /migrate) 将搁置集取消搁置到不同的工作区/分支。
    【解决方案5】:

    虽然此解决方案不涉及纯 TFS 解决方案,但它不会像 Lee Richardson 的回答那样涉及弄乱 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. 从您要为其追溯创建搁置集的提交之前发生的提交创建一个新分支:

      $ 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 解决方案

    【讨论】:

      猜你喜欢
      • 2016-01-03
      • 2015-12-21
      • 1970-01-01
      • 2018-01-08
      • 2011-03-15
      • 2012-01-19
      • 2011-03-11
      • 1970-01-01
      • 2018-01-15
      相关资源
      最近更新 更多