4

TFS SDKを使用していて、プロジェクトの最新バージョンを取得できるメソッドがあります。しかし、私がメソッドを呼び出したとき、それは常にファイルを再ダウンロードしていました。これも時間がかかります。

私はそれを試しました、私はchangeSetを取得し、特にアイテムを比較します。アイテムに変更がある場合は、ダウンロードしてください。しかし、この方法にも長い時間がかかります。

これは、changeSetをチェックしない最初のコードです。

ItemSet items = sourceControl.GetItems(itemPath, VersionSpec.Latest, RecursionType.Full);
foreach (Item item in items.Items)
{                    
    localName = item.ServerItem.ToString();
    localName = localName.Substring(2, (localName.Length - 2)).Replace("/", "\\");

    switch (item.ItemType)
    {
        case ItemType.Any:
            throw new ArgumentOutOfRangeException("ItemType returned was Any; expected File or Folder.");
        case ItemType.File:
            item.DownloadFile("D:\\WORK\\Tries\\"+localName);
            break;
        case ItemType.Folder:
            Directory.CreateDirectory("D:\\WORK\\Tries\\"+localName);
            break;
    }
}  

そして、それはチェンジセットをチェックする私の新しいコードです

ItemSet items = sourceControl.GetItems(itemPath, VersionSpec.Latest, RecursionType.Full);

foreach (Item item in items.Items)
{                    
    localName = item.ServerItem.ToString();
    localName = localName.Substring(2, (localName.Length - 2)).Replace("/", "\\");

    var histories = sourceControl.QueryHistory(itemPath, VersionSpec.Latest, 0, RecursionType.OneLevel, null, null, null, Int32.MaxValue, true, false, true);
    bool check = false;

    foreach (Changeset history in histories)
    {
        foreach (Change change in history.Changes)
        {
            if (change.Item.Equals(item))
                check = true;
        }

    }

    switch (item.ItemType)
    {
        case ItemType.Any:
            throw new ArgumentOutOfRangeException("ItemType returned was Any; expected File or Folder.");
        case ItemType.File:
            if(check)
                item.DownloadFile("D:\\WORK\\Tries\\"+localName);
            break;
        case ItemType.Folder:
            if(!Directory.Exists("D:\\WORK\\Tries\\" + localName))
                Directory.CreateDirectory("D:\\WORK\\Tries\\"+localName);
            break;
    }
}

誰か提案がありますか?ありがとう。

編集:私はこの方法で問題を解決しました:

            String ServerFolder = itemPath; // start with "$/ + serverFolder path"
            itemPath = itemPath.Substring(2, (itemPath.Length - 2)).Replace("/", "\\");

            String LocalFolder = @"D:\WORK\"+itemPath;

            WorkingFolder workfolder = new WorkingFolder(ServerFolder, LocalFolder);
            workspace.CreateMapping(workfolder);

            workspace.Get(VersionSpec.Latest,GetOptions.Overwrite);
4

1 に答える 1

6

ワークスペースを最新の変更に更新しようとしている場合、実際には間違ったメソッドを呼び出しています。VersionControlServer.GetItems()は、サーバーにどのアイテムがあるかをリストするように要求する方法です。それは常にあなたに同じ答えを教えてくれます。

ワークスペース内のアイテムを最新のものに更新しようとしている場合は、対応するワークスペースオブジェクトを取得してから、そのオブジェクトで「Get」メソッドを呼び出す必要があります。それはあなたが要求しているバージョンから古いファイルをダウンロードします。

編集:いくつかのサンプルコードを追加します:

// Get a reference to our Team Foundation Server. 
TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri("http://<yourserver>:8080/tfs/<yourcollection> "));

// Get a reference to Version Control. 
VersionControlServer versionControl = tpc.GetService<VersionControlServer>();

Workspace workspace = versionControl.GetWorkspace("<local path to your workspace>");
workspace.Get();
于 2012-09-06T17:58:06.527 に答える