项目开发过程中,为了提高开发效率,统一代码版本,方便管理,程序员都喜欢使用一些版本控制工具,如:SVN、VSS、TFS、Git等。我这里使用的是TFS管理工具,由于是多年前的旧项目,TFS服务器早就GG了,每次打开都有提示
---------------------------
Microsoft Visual Studio
---------------------------
Team Foundation Server 版本控制
您正在打开的解决方案已绑定到以下 Team Foundation Server 上的源代码管理: http://xxx.xxx.xxx。是否要联系此服务器以尝试启用源代码管理集成?
---------------------------
是(Y) 否(N) 帮助
---------------------------
因此在网上查看了一些TFS资料后,写了个小工具,用来清除TFS版本控制相关文件和文件中的节点
Team Foundation Server
// 删除TFS版本文件和TFS项目残留节点
class Program
{
// 委托定义:带一个字符串的委托
delegate void DWriteline(string message);
// 委托方法
static DWriteline m_Writeline = Console.WriteLine;
// 入参文件路径
static System.IO.DirectoryInfo m_DirectoryInfo;
// 文件深度,默认等于2,最多是3
static int m_Level;
// 程序入口
static void Main(string[] args)
{
do
{
m_Level = 2;
/*
* 1.录入项目路径
* 2.删除所有的*.vssscc,*.vspscc文件
* 3.清除解决方案文件(*.sln)文件中的版本标记节点
* GlobalSection(TeamFoundationVersionControl) = preSolution 与 EndGlobalSection及其节点中的所有内容
* 4.清除项目文件(*.project)删除节点
* <SccProjectName>???</SccProjectName>
* <SccLocalPath>???</SccLocalPath>
* <SccAuxPath>???</SccAuxPath>
* <SccProvider>???</SccProvider>
*/
m_Writeline("请录入有效的项目路径(退出请输入X/x):");
string folder = Console.ReadLine();
if (folder.ToUpper() == "X")
{
break;
}
if (CheckFolder(folder) == false)
continue;
DeleteVersionSectionAndFile(m_DirectoryInfo, m_Level);
} while (true);
}
// 检查路径是否有效
static bool CheckFolder(string folder)
{
if (System.IO.Directory.Exists(folder.Replace("\"", "")) == false)
{
m_Writeline("无效的目录");
return false;
}
m_DirectoryInfo = new System.IO.DirectoryInfo(folder.Replace("\"", ""));
// 如果当前目录含(*.sln)文件则文件深度加一(项目深度默认深度为二)
var sln = m_DirectoryInfo.GetFiles("*.sln");
if (sln.Length == 0)
{
m_Level++;
}
return true;
}
// 删除版本节点和版本文件
static void DeleteVersionSectionAndFile(System.IO.DirectoryInfo direcoryInfo, int level)
{
if (level > 0)
{
DeleteSlnVersionSection(direcoryInfo);
DeleteProjectVersionSection(direcoryInfo);
DeleteTFSVersionFile(direcoryInfo);
var directories = direcoryInfo.GetDirectories();
if (directories != null)
{
level--;
foreach (var directory in directories)
{
DeleteVersionSectionAndFile(new System.IO.DirectoryInfo(directory.FullName), level);
}
}
}
}
// 删除解决方案中的版本节点
static void DeleteSlnVersionSection(System.IO.DirectoryInfo direcoryInfo)
{
var sln = direcoryInfo.GetFiles("*.sln");
foreach (var file in sln)
{
StringBuilder slnBuilder = new StringBuilder();
System.IO.StreamReader slnReader = file.OpenText();
string line;
int flag = 0;
int count = 0;
do
{
line = slnReader.ReadLine();
if (line == null)
break;
if (line.IndexOf("GlobalSection(TeamFoundationVersionControl)") > -1)
{
flag = 1;
count++;
continue;
}
if (flag == 1 && line.IndexOf("EndGlobalSection") > -1)
{
flag = 0;
continue;
}
if (flag == 0)
{
slnBuilder.AppendLine(line);
}
}
while (line != null);
slnReader.Close();
if (count > 0)
{
System.IO.StreamWriter slnWriter = new System.IO.StreamWriter(file.FullName, false, Encoding.UTF8);
slnWriter.Write(slnBuilder.ToString());
slnWriter.Close();
}
}
}
// 删除项目文件中的版本节点
static void DeleteProjectVersionSection(System.IO.DirectoryInfo direcoryInfo)
{
var sln = direcoryInfo.GetFiles("*.csproj");
foreach (var file in sln)
{
StringBuilder slnBuilder = new StringBuilder();
System.IO.StreamReader slnReader = file.OpenText();
string line;
int count = 0;//用于标记是否还有版本标记
do
{
line = slnReader.ReadLine();
if (line == null)
{
break;
}
if (line.IndexOf("<SccProjectName>") > -1 || line.IndexOf("<SccLocalPath>") > -1 || line.IndexOf("<SccAuxPath>") > -1 || line.IndexOf("<SccProvider>") > -1)
{
count++;
continue;
}
else
{
slnBuilder.AppendLine(line);
}
}
while (line != null);
slnReader.Close();
if (count > 0)
{
System.IO.StreamWriter slnWriter = new System.IO.StreamWriter(file.FullName, false, Encoding.UTF8);
slnWriter.Write(slnBuilder.ToString());
slnWriter.Close();
}
}
}
// 删除版本文件
static void DeleteTFSVersionFile(System.IO.DirectoryInfo direcoryInfo)
{
// 查找项目解决方案版本控制
var vssscc = direcoryInfo.GetFiles("*.vssscc");
foreach (var file in vssscc)
System.IO.File.Delete(file.FullName);
// 查找项目文件版本控制
var vspscc = direcoryInfo.GetFiles("*.vspscc");
foreach (var file in vspscc)
System.IO.File.Delete(file.FullName);
}
}