从解决方案中删除TFS连接

97

如何使解决方案成为没有映射到TFS的干净副本?问题是当我尝试打开它时会显示此消息。我想像平常一样打开它,而不需要TFS连接。

输入图像说明


谢谢你的提问。我一直在寻找类似svn export的tfs导出功能,花了几分钟,然后休息了一下,搜索了tfs unlink,找到了这个帖子。 - undefined
7个回答

224
为完全移除TFS源代码控制绑定,请按照以下两个步骤操作:
  1. 进入您的解决方案文件夹,找到并删除所有扩展名为*.vssscc*.vspscc的文件。
  2. 使用记事本打开您的解决方案的.sln文件,并查找并删除GlobalSection(TeamFoundationVersionControl)部分。
更多详情请参见链接

也解决了我的问题。我想你不能仅在Visual Studio中完全提取TFS。 - Rudy Scoggins
3
除了团队基础架构的输出仍然显示“找不到解决方案的映射”外,这对我很有效。 找不到解决方案的映射。 由于服务器不可用,活动解决方案已暂时与源代码控制断开连接。要尝试重新连接到源代码控制,请在服务器可用时关闭并重新打开解决方案。如果您想将此解决方案连接到另一个服务器,请使用“更改源代码控制”对话框。 - EngineerWithJava54321
3
我会尽力为您翻译:这对我起了作用。我按照“参考链接”的说明进行操作。 - Lei Shi
所有的*.vs*文件都表示解决方案和项目文件夹。 - ourmandave
这对我有所帮助,但我还需要做一些额外的事情(不确定是否是 VS 2022 的问题): 1)在运行上述步骤之前关闭解决方案 2)复制工作区 3)从 VS 中删除工作区此时,该解决方案不再连接到 TFS。不知何故,仅对此解决方案执行步骤一和步骤二就将工作区链接到了 TFS。 - Zonus
显示剩余2条评论

59

如果您想永久性地完全将解决方案与源代码控制分离,请尝试以下步骤:

  1. 点击“否”按钮,以避免连接到 TFS。
  2. 在文件菜单中,进入源代码控制选项并清除绑定。具体而言,您需要选择 文件 - 源代码控制 - 高级 - 更改源代码控制 ...
  3. 保存解决方案。

下次打开解决方案时,您将不会收到连接TFS的提示。


1
在我的情况下,需要使用VS2013将TFS与VS2010解决方案分离。 - bvj
我不得不在Chrome中重新启用Javascript(为了测试而关闭),以便显示此选项。公平地说,MSVC确实在TFS登录屏幕上闪现了警告消息。 - Anthony
需要补充的一点是,您需要在解决方案资源管理器中选择解决方案,才能启用“更改源代码控制”的选项。 - Arnab
3
在VS2017中,这没有影响,下次打开解决方案时,您仍然需要选择“不要与TFS联系”并选择“确定”以继续出现的错误消息。 - Gerard
在VS2015 Update 3中也没有任何效果。 - Matthieu
显示剩余3条评论

48

编辑解决方案文件并从中删除以下部分。它不会完全相同但会类似。

注意:要编辑解决方案文件,请转到项目文件夹,然后使用记事本打开YouSolutionName.sln文件。

GlobalSection(TeamFoundationVersionControl) = preSolution
    SccNumberOfProjects = 2
    SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
    SccTeamFoundationServer = <YourTFSURL>
    SccLocalPath0 = .
    SccProjectUniqueName1 = .
    SccLocalPath1 = .
EndGlobalSection

24

我没有足够的声望来发表评论,但只是想补充一下Tabish的解决方案确实可以正确地从源代码控制中完全删除解决方案,特别是当TFS服务器由于某种原因无法访问时(例如,您下载了作者在上传之前未从其自己的源代码控制中删除的项目)。

然而,为了完全从项目中删除所有源代码控制痕迹,并避免在该答案的其他评论中所指出的警告(例如,“找不到解决方案的映射...”),您还必须从每个项目文件中删除以下行(显然,在早期版本的VS中,这些行存在于解决方案文件中,但在VS2017中,它们被发现在解决方案中每个项目的项目文件中-例如[project].csproj):

SccProjectName = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
SccAuxPath = "x"
SccLocalPath = "xxx"
SccProvider = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

感谢此处标记答案和其他评论指出了这一点:

visual source safe - 如何在不打开Visual Studio的情况下从解决方案中删除绑定

将此与Tabish的答案相结合,似乎是手动从源代码控制中完全移除解决方案的最完整方法。


8
  • 要解除绑定,可以使用Visual Studio:菜单文件/源代码控制/高级/更改源代码控制。

  • 您也可以通过从sln和csproj中删除任何SCC ...来自行完成。

  • 如果您经常导出源文件,可以使用ExportSrc。 它有很多选项,例如默认情况下删除TFS绑定。


5

大多数答案都提供了解决方案,但我更愿意使用Visual Studio 2017提供的解决方案。

在Visual Studio的菜单栏中,选择团队并选择从Team Foundation Server断开连接即可。


2
它只是关闭你的解决方案吗? - Hanako

3
我刚刚接手了一批团队基础架构项目,这是一次并购和技术转移。大约有30多个解决方案和许多*.vssscc和*.vspscc文件。
根据以上所有人的建议,我编写了一个PowerShell函数来递归指定的根目录,删除文件,然后编辑解决方案文件以删除TeamFoundationVersionControl部分。
使用方式为Remove_TFSfiles "pathname" $booleanflag
要查看哪些文件会受到影响,请使用$false(使用-whatif)。
Remove_TFSfiles "C:\MyDevFolder" $false

要实际删除这些文件,请使用$true: "最初的回答"。
Remove_TFSfiles "C:\MyDevFolder" $true

这里是函数:

Function Remove_TFSfiles { 
    param(
        [string]$FolderName = $(throw "-FolderName is required."),
        [bool]$RemoveFiles = $(throw "-RemoveFiles (either $true or $false) is required.")
    )
    $TFSExtensions = '*.vspscc', '*.vssscc'                          

    if ($RemoveFiles) {
        Get-ChildItem -path $FolderName -force -include $TFSExtensions -Recurse | Remove-Item -Force        
        # Now iterate through any solution files, and whack the TeamFoundationVersionControl section
        Get-ChildItem -Path $FolderName -Filter "*.sln" -Recurse | ForEach-Object {
            $slnFilename = $_.Fullname
            Write-Host -NoNewline "Editing $slnFilename... "
            $File = Get-Content $slnFilename -raw
            $Filestr = [regex]::escape("" + $File + "")
            # The regex escapes must themselves be meta-escaped, therefore "\(" becomes "\\" + "\(" = "\\\(". Did I mention I hate regex?
            $Result = $Filestr -replace "\\tGlobalSection\\\(TeamFoundationVersionControl\\\).*?EndGlobalSection\\r\\n", ""
            $result = [regex]::unescape($result)
            Set-ItemProperty $slnFilename IsReadOnly $false
            $result | Set-Content $slnFilename 
            Write-Host "Done"
        }
        Write-Host -f red "Finished actually removing files and editing *.sln files"
    }
    else {
        Get-ChildItem -path $FolderName -force -include $TFSExtensions -Recurse | Remove-Item -WhatIf
        Write-Host -f green "Finished pretending to remove files"
        # Now iterate through any solution files, and whack the TeamFoundationVersionControl section
        Get-ChildItem -Path $FolderName -Filter "*.sln" -Recurse | ForEach-Object {
            $slnFilename = $_.Fullname 
            Write-Host "Not Editing $slnFilename"
        }
    }
}

我喜欢它,它运行得非常好!!! - Walter Verhoeven
你也可以在命令提示符中执行 del *.vssscc /s。 - Zonus
1
谢谢!这正是我希望找到的!而且这仍然相关 - 在我的情况下是因为BizTalk 2016需要VS2015,所以团队没有费心改变代码库的源控制。如果您想在自己的脚本中实现whatif,那么这篇文章是一个很好的whatif实现文章。好处是whatif标志会自动传递给下层命令(或者也许您的变体在这种情况下更好!)。 - housten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接