我正在使用TFS API在TFS绑定文件夹下获取最新的代码文件,目录,.csproj文件等。
同样,我使用如下内容:
var tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new
Uri(ConfigurationManager.AppSettings["TFSUrl"]));
tfs.EnsureAuthenticated();
var vsStore = tfs.GetService<VersionControlServer>();
string workingFolder = @"C:\TFS\SolutionFolder";
Workspace wsp = vsStore.TryGetWorkspace(workingFolder);
if (wsp != null)
{
ItemSet items = vsStore.GetItems(workingFolder, VersionSpec.Latest, RecursionType.Full);
string relativePath = workingFolder + @"/";
foreach (Item item in items.Items)
{
string relativePath1 = item.ServerItem.Replace("$/TFS/SolutionFolder", relativePath);
if (item.ItemType == ItemType.Folder)
{
Directory.CreateDirectory(relativePath1);
}
else
{
item.DownloadFile(relativePath1);
}
}
}
现在,我得到了要下载的项目,然后下载了。但是,我想让它像VS处理它一样 - 如果(并且仅当)文件/文件夹中有更改,则只下载相同的文件/文件夹。使用此代码,我总是在该文件夹中获得'n'个文件/文件夹,然后我覆盖相同的文件/文件夹。我知道错误的方法。但是,我可以修改此代码以检查文件夹或文件的上次更改时间,然后选择覆盖它或忽略它。这是一个选择,虽然是一个糟糕的选择。
现在,我理想的是仅获取实际需要更改的文件/文件夹列表,即增量更改。之后,我可以选择覆盖/忽略该列表中的每个项目。因此,在目前的情况下,如果创建了一个新的文件/文件夹(或者现有的一个在$ / TFS / SolutionFolder中更改,即在服务器中),那么我只想在文件列表中拉出该项目/要更改的文件夹(并在C:\ TFS \ SolutionFolder中决定我想用它做什么)。
另外,使用VersionControlServer.QueryHistory()的一个重载是一个选项吗?我有这样的事情:
(latestVersionIdOf $/TFS/SolutionFolder) - (existingVersionIdOf C:\TFS\SolutionFolder) = (Versions that I'd go out and get back from the server, for that folder)
记住。
任何指针都会非常有用。谢谢!
答案 0 :(得分:1)
只需使用Workspace.Get()或重载方法(wsp.Get()),它就会更新更新的文件。
答案 1 :(得分:0)
我认为我们无法实现这一目标。如果文件被下载到没有源代码控制的文件夹,则文件夹中没有版本进行比较,即使文件夹在源代码控制中,行为也只是下载也没有版本比较操作。因此,它会随时下载所有文件,然后覆盖相同的文件。
在VS中,文件都在TFS源代码控制系统中,因此当我们获取最新版本时,将从TFS中检索已更改/添加的文件。如果要获得与VS处理相同的行为,可以使用tf get
命令。见Get Command
您可以参考这篇文章来使用tf get命令: get-latest-version-of-specific-files-with-tfs-power-tools
答案 2 :(得分:0)
更新: -
var tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(ConfigurationManager.AppSettings["TFSUrl"]));
tfs.EnsureAuthenticated();
var vsStore = tfs.GetService<VersionControlServer>();
string workingFolder = ConfigurationManager.AppSettings["LocalPathToFolder"]; // C:\TFS\SolutionFolder
string tfsPathToFolder = ConfigurationManager.AppSettings["TFSPathToFolder"]; // $/TFS/SolutionFolder
Workspace wsp = vsStore.GetWorkspace(workingFolder);
if (wsp != null)
{
ItemSpec[] specs = { new ItemSpec(tfsPathToFolder, RecursionType.Full) };
ExtendedItem[][] extendedItems = wsp.GetExtendedItems(specs, DeletedState.NonDeleted, ItemType.Any);
ExtendedItem[] extendedItem = extendedItems[0];
var itemsToDownload = extendedItem.Where(itemToDownload => itemToDownload.IsLatest == false);
foreach (var itemToDownload in itemsToDownload)
{
try
{
switch (itemToDownload.ItemType)
{
case ItemType.File:
if (itemToDownload.LocalItem != null)
{
vsStore.DownloadFile(itemToDownload.SourceServerItem, itemToDownload.LocalItem);
}
else
{
string localItemPath = itemToDownload.SourceServerItem.Replace(tfsPathToFolder,
workingFolder);
vsStore.DownloadFile(itemToDownload.SourceServerItem, localItemPath);
}
break;
case ItemType.Folder:
string folderName = itemToDownload.SourceServerItem.Replace(tfsPathToFolder, workingFolder);
if ((!string.IsNullOrEmpty(folderName)) && (!Directory.Exists(folderName)))
{
Directory.CreateDirectory(folderName);
}
break;
}
}
catch (Exception e)
{
File.AppendAllText(@"C:\TempLocation\GetLatestExceptions.txt", e.Message);
}
}
}
此代码效果很好,除了:
一个。每当它下载最新的副本时,让我们说一个文件,它就会检查出来的文件。在TFS :(
湾对于某些项目,它会抛出错误,例如在版本T的源代码管理中找不到Item $ / TFS / SolutionFolder / FolderX / abc.cs。&#39; - 不过,我必须找出这个问题的确切原因。
有关如何解决这两个问题的任何想法或您在此代码中看到的任何其他问题?谢谢!