【发布时间】:2015-01-15 09:19:36
【问题描述】:
如何在不映射到 TFS 的情况下将解决方案制作为干净的副本?问题是当我尝试打开它时会显示此消息。我想在没有 TFS 连接的情况下正常打开它。
【问题讨论】:
标签: visual-studio tfs
如何在不映射到 TFS 的情况下将解决方案制作为干净的副本?问题是当我尝试打开它时会显示此消息。我想在没有 TFS 连接的情况下正常打开它。
【问题讨论】:
标签: visual-studio tfs
要完全删除 TFS 源代码控制绑定,请执行以下两个步骤:
*.vssscc 和*.vspscc 扩展名的文件。.sln 文件,然后找到并删除 GlobalSection(TeamFoundationVersionControl) 部分。更多详情请参考Link
【讨论】:
如果您想永久彻底地从源代码管理中分离解决方案,请尝试以下操作:
下次打开解决方案时,系统不会提示您连接到 TFS。
【讨论】:
编辑解决方案文件并从中删除以下部分。它不会相同,但会相似。
注意:要编辑解决方案文件,请转到项目文件夹,然后用记事本打开YouSolutionName.sln 文件。
GlobalSection(TeamFoundationVersionControl) = preSolution
SccNumberOfProjects = 2
SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
SccTeamFoundationServer = <YourTFSURL>
SccLocalPath0 = .
SccProjectUniqueName1 = .
SccLocalPath1 = .
EndGlobalSection
【讨论】:
我没有足够的声誉来发表评论,但只是想补充一点,Tabish 的解决方案实际上确实可以正常工作,从而将解决方案从源代码控制中完全删除,尤其是当 TFS 服务器由于某种原因而无法访问时(例如您下载了作者在上传之前没有从他们自己的源代码管理中删除的项目。
但是,要从项目中完全删除所有源代码控制痕迹并避免其他 cmets 中对该答案的警告(例如“找不到解决方案的映射...”),您必须还从解决方案中的每个项目文件中删除以下行(显然这些在早期版本的VS的解决方案文件中,但在VS2017中,它们可以在每个项目的项目文件中找到解决方案 - 例如 [project].csproj):
SccProjectName = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
SccAuxPath = "x"
SccLocalPath = "xxx"
SccProvider = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
感谢此处的标记答案和其他 cmets 指出这一点:
visual source safe - how to remove bindings from solution w/o opening in visual studio
将此与 Tabish 的答案结合起来似乎是从源代码管理中手动删除解决方案的最完整方法。
【讨论】:
要删除绑定,您可以使用 Visual Studio:菜单文件/源代码控制/高级/更改源代码控制。
您也可以通过从 sln 和 csproj 中删除任何 SCC... 来自行完成。
如果你经常导出源文件,可以使用ExportSrc。它有许多选项,例如删除 TFS 绑定(默认为 ON)。
【讨论】:
大部分答案都提供了解决方案,但我宁愿使用 Visual Studio 2017 提供的解决方案。
在 Visual Studio 的菜单栏上,转到 Team 并选择 Disconnect from Team Foundation Server。 就是这样。
【讨论】:
在并购和技术转让之后,我刚刚继承了一系列 TeamFoundation 项目。大约有 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"
}
}
}
【讨论】: