TFS Meltdown - 如何恢复搁置的变更

ind*_*dra 3 unshelve visual-studio-2010 shelveset tfs2010

我将我的工作文件夹设置为RAM驱动器.在夜间有一个长时间停电,UPS用完了,我的机器坏了.值得庆幸的是,在我回家之前,我搁置了我的更改,并且在团队浏览器中可以看到搁置集.变更集包括项目文件和一些尚未添加到源代码管理的新文件.

我正在尝试恢复受影响的文件但收到错误:

试图查看被搁置的文件给出TF10187(或一般的,未编号的), The system cannot find the file specified即使我可以在Pending Changes列表中看到它们.

试图完全取消整个集合会产生与incompatible changes我无法解决的错误.

TFS在RAM光盘上本地缓存了shelveset,后来自己重新初始化,因此丢失了缓存,但我希望我错了.

有人可以帮忙吗?

小智 6

我昨天有人来找我并问同样的问题,幸运的是他们有TFS项目数据库的备份(tfs_),所以我们将其恢复到另一个数据库,然后我四处寻找并弄清楚了(所以,如果你有备份那么是的,你可以恢复所有文件).

首先是关于数据库中表的一些信息.

可以通过查询tbl_Workspace表并查找Type = 1(Shelveset)的所有记录来识别Shelveset,您当然也可以使用WorkspaceName列按名称进行过滤.

其他感兴趣的表是:

tbl_PendingChanges(从tbl_Workspace引用WorkspaceId) - 哪些文件是ShelveSet的一部分

tbl_VersionedItem(通过ItemId列链接到tbl_PendingChanges) - 父路径和文件名

tbl_Content(通过FileId链接到PendingChanges) - 这是您的文件内容作为压缩(gzip)数据存储的位置

现在为解决方案; 以下查询可以显示您的文件:

SELECT c.[CreationDate], c.[Content], vi.[ChildItem], vi.ParentPath
FROM [dbo].[tbl_Content] c 
INNER JOIN [dbo].[tbl_PendingChange] pc ON pc.FileId = c.FileId
INNER JOIN [dbo].[tbl_Workspace] w ON w.WorkspaceId = pc.WorkspaceId
INNER JOIN [dbo].[tbl_VersionedItem] vi ON vi.ItemId = pc.ItemId
WHERE w.WorkspaceName = '<YOUR SHELVESET NAME>'
Run Code Online (Sandbox Code Playgroud)

有了这个,我编写了一些代码来从SQL中获取数据,然后使用GZipStream类解压缩内容并将文件保存到磁盘.

一个星期的工作又回来了一个小时左右.

这是通过TFS 2010完成的.

希望这可以帮助!