TFSにマッピングせずにクリーンコピーとしてソリューションを作成するにはどうすればよいですか?問題は、このメッセージを開こうとすると表示されることです。TFS接続なしで通常どおりに開きたい。
回答:
ソリューションをソース管理から永続的かつ完全に切り離したい場合は、次のことを試してください。
次回ソリューションを開いたときに、TFSに接続するように求められることはありません。
TFSソース管理バインディングを完全に削除するには、次の2つの手順に従います。
*.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 SourceSafe-VisualStudioで開くことなくソリューションからバインディングを削除する方法
これをTabishの答えと組み合わせることが、ソース管理からソリューションを手動で削除する最も完全な方法のようです。
ほとんどの回答が解決策を提供しましたが、私はむしろVisual Studio2017が提供する解決策を使用したいと思います。
Visual Studioのメニューバーで、[チーム]に移動し、[ Team FoundationServerから切断]を選択します。それでおしまい。
M&Aの買収と技術移転の後、TeamFoundationプロジェクトのコレクションを継承しました。30以上のソリューションがあり、*。vsssccファイルと* .vspsccファイルが大量にありました。
上記の全員の入力に基づいて、指定したルートフォルダーを再帰的に実行し、ファイルを削除してから、ソリューションファイルを編集してTeamFoundationVersionControlセクションを削除するPowerShell関数を作成しました。
使用法は 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"
}
}
}