用户删除文件并创建具有相同名称的新文件时,TFS回滚

时间:2009-10-20 14:55:58

标签: tfs filenames collision delete-file

有人(除了我自己)意外地删除了TFS中的文件并将其签入。他随后发现了他的错误并想要从他自己的硬盘中替换丢失的文件。 在他的错误和我发现它之间,其他人已经对相邻文件进行了更改。 现在,我想将删除的文件回滚到删除前的状态,但是当我尝试时,我得到一个文件夹冲突错误(如果我理解正确的话)原始文件和他的替换。

由于已完成其他工作,我无法回滚整个项目,我只想将这些文件恢复到“之前”的状态。

有没有人遇到过这个问题并解决了?或者没有解决方案。

3 个答案:

答案 0 :(得分:1)

谢谢大家的意见。 为了将来参考,我最终解决了这个问题:

首先,我拿了一份文件的本地副本。

在Source Control Explorer中,我然后将包含该文件的文件夹回滚到更改集,其中旧文件已被删除但新文件尚未存在。 我取消删除该文件并签入,从而将原始文件“从超出范围内”恢复。

之后,几乎就是将我的本地副本和恢复的文件放入diff工具(我使用BeyondCompare BTW)并更正恢复的文件以匹配新版本。

由于几个原因,我可以做到这一点,即:

  • 删除和重新添加文件是在两个连续的变更集中完成的。
  • 恢复的文件和本地副本之间的区别是“非常小”(即添加的方法和另一种更改黑客)。

我不知道如果我们在几周之后没有错过有问题的文件会发生什么,我们会对周围的代码进行一些更改。我也不清楚本地版本对可恢复性的任何重大改变是什么意思。

答案 1 :(得分:0)

  • 将您的解决方案回滚到另一个工作副本。
  • 将已删除的文件从该工作副本中拉出,然后将其恢复为当前的工作副本
  • 将这些文件签入当前项目。

我在这里只能看到问题,是否可能会丢失已删除文件的历史记录。

答案 2 :(得分:0)

听起来像Power Tools的工作。你走了:

$deletedFiles = 
    Get-TfsChangeset 12345| 
    % { $_.changes } | 
    ? { $_.changetype.tostring().contains("Delete") } |
    % { $_.item.serveritem }

$deletedFiles | 
    Add-TfsPendingChange -Delete | 
    New-TfsChangeset -Comment "Delete mistakenly re-added files"

$deletedFiles |    
    Get-TfsChildItem -Deleted |
    ? { $_.changesetid -eq 12345 } |
    # this bit of ugliness is required by a bug in the Power Tools
    % { "$($_.serveritem);X$($_.deletionid)" } | 
    Add-TfsPendingChange -Undelete |
    New-TfsChangeset -Comment "Undelete old files"

正如评论中所提到的,在理想的Powershell世界中,最终管道中的丑陋字符串解析不是必需的。如果事情按预期工作,您可以删除该行(或等效地,用 Select-TfsItem | 替换它)。不幸的是,Power Tools似乎并不像我想要的那样处理删除ID。

无论如何,这个脚本应该按照你的要求做。注意:

  • 将12368替换为用户意外删除文件的变更集
  • 如果需要,用Destroy
  • 替换第二个管道中的delete + checkin
  • 这不会还原系统中的任何其他更改(包括#12345中的其他更改),只会导致文件名冲突的更改