如何在不映射到TFS的情况下使解决方案成为干净副本?问题是当我尝试打开该消息时会显示该消息。我想在没有TFS连接的情况下正常打开它。
Answers:
如果要永久和完全从源代码管理中分离解决方案,请尝试以下操作:
下次打开解决方案时,不会提示您连接到TFS。
要完全删除TFS源代码管理绑定,请执行以下两个步骤:
*.vssscc
和*.vspscc
扩展名的。.sln
在记事本中打开解决方案的文件,然后找到并删除GlobalSection(TeamFoundationVersionControl)
部分。有关参考链接的更多详细信息
编辑解决方案文件,然后从其中删除以下部分。不会一样,但是会相似。
注意:要编辑解决方案文件,请转到项目文件夹,然后YouSolutionName.sln
使用记事本打开文件。
GlobalSection(TeamFoundationVersionControl) = preSolution
SccNumberOfProjects = 2
SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
SccTeamFoundationServer = <YourTFSURL>
SccLocalPath0 = .
SccProjectUniqueName1 = .
SccLocalPath1 = .
EndGlobalSection
我没有足够的信誉来发表评论,但是我想补充一点,Tabish的解决方案实际上可以正常工作,以将其从源代码管理中完全删除,尤其是在由于某种原因而无法访问TFS服务器时(例如,您下载了一个上传之前作者没有从自己的源代码管理中删除的项目)。
但是,要从项目中完全删除所有源代码控制痕迹,并避免对该答案的其他注释中提到的警告(例如,“找不到解决方案的映射...”),还必须删除该警告。解决方案中每个项目文件的以下行(显然,这些行以前在VS的早期版本中位于解决方案文件中,但在VS2017中,可以在解决方案中每个项目的项目文件中找到它们-例如[project] .csproj):
SccProjectName = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
SccAuxPath = "x"
SccLocalPath = "xxx"
SccProvider = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
感谢标记的答案和此处的其他评论指出这一点:
Visual Source Safe-如何从Visual Studio中不打开解决方案的解决方案中删除绑定
将此与Tabish的答案结合起来似乎是从源代码管理中手动删除解决方案的最完整方法。
大多数答案都提供了解决方案,但我宁愿使用Visual Studio 2017提供的解决方案。
在Visual Studio的菜单栏上,转到“团队”,然后选择“从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"
}
}
}