5

そのため、TFS のワークスペースからファイルを取得しようとしています。残念ながら、私がこれを試みたすべての試みは、アプリケーションの停止という結果に終わりました。現時点では、これはコードです:

    public void GetWorkspaceFiles(string workspaceName)
    {
        VersionControlServer sourceControl = (VersionControlServer)TfsServer.GetService(typeof(VersionControlServer));

        var items = sourceControl.GetItems(workspaceName, VersionSpec.Latest, RecursionType.Full)
                                 .Items
                                 .Where(x => x.ItemType == ItemType.File)
                                 .ToList();

        for (int x = 0; x < items.Count; x++)
            items[x].DownloadFile();

何が起こるかというと、このアプリケーションを (複数のマシンで) 実行するたびに、 で停止しitems[x].DownloadFile()ます。TFS 内のすべてのファイルはロックされていません。すべて問題ありません。メソッドを使用しようとしてもWorkspace.Get()、同じ結果になります。

一時停止を押すと、x は特定の値になりますが、アイテム コレクションにアクセスできません。たとえば、「現在のスレッドがスリープ、待機、または結合中であるため、式を評価できません」というメッセージが表示されます。コールスタックを評価すると、次のようになります。

[In a sleep, wait, or join]
[External Code]
GetWorkspaceFiles(string workspaceName) Line 55

私はさらに何をすべきか途方に暮れています。アプリケーションを一時停止するたびに、x常に同じ値になります (停止する値は、アプリケーションの実行ごとに異なります)。

誰にもアイデアはありますか?


編集:診断ロジックを追加した後(グラントの回答のリンクに基づいて)、これまで以上に混乱しています。

このメソッドに渡すワークスペースは$/QA/Automated Test Scripts/Regression or System Test Scripts/RDE or Condo(デバッガーで検証済み) です。

ただし、tfs ログを見ると、次のように、実行中のコード ファイルをダウンロードしているように見えます。

02/10/2011 12:26:58 (pid 5808, tid 5968, 42180 ms) Recording OperationStatus.Getting for $/QA/Automated Test Scripts/QA Tools/Test Manager/Test Polling Server/fmMain.cs

そのエントリの直後は次のとおりです。

02/10/2011 12:26:58 (pid 5808, tid 5968, 42180 ms) DownloadFiles: 18 ms
02/10/2011 12:26:58 (pid 5808, tid 5968, 42181 ms) Acknowledgements: 0 ms

その後、ログ ファイルは更新されず、アプリケーションは停止します。私が混乱しているのは

1) 完全に異なる TFS ワークスペースを指定しているときに、これが TFS からアプリケーション コードをプルしようとするのはなぜですか?

2) ファイルを取得しようとした後、なぜこれが停止するのですか? が Visual Studio で開いていることが原因である可能性がfmMain.csありますが、それでも例外が発生し、ハングアップすることはありません。通常、ビジュアルスタジオでファイルを開いている間に最新のものを取得できます。



編集2:

わかりましたので、MSDN を読んでいて、ワークスペース名がファイルへのローカル パスであることに気付きました。workspaceNameそのため、ファイルのローカル ディレクトリへのパラメーターとして渡したものを変更しました。それでもストールが発生しますが、ログ ファイルにはその理由があまり明確ではありません。ここに tf.log ファイルをアップロードしました(サーバー名やプロジェクト名などの機密情報は明らかに変更しましたが、それ以外はすべて変更していません)。その最後のログ エントリの後、それ以上のデータはログに書き込まれません。

4

3 に答える 3

7

GetItems はワークスペース名を取りません。サーバー パスを使用してファイルのリストを取得します。特定の領域からファイルのコピーを取得しようとしている場合は、次のようにします。

  var items = sourceControl.GetItems("$/Project/Path/subpath"/et cetera", VersionSpec.Latest, RecursionType.Full)
                                 .Items
                                 .Where(x => x.ItemType == ItemType.File)
                                 .ToList();

電話すると

items[x].DownloadFile();

実際にファイルをディスクにダウンロードするのではなく、ストリームを返しています。その時点でファイルをディスクに書き込みたい場合は、通常のストリーム処理を行ってファイルを書き出す必要があります。

実際に TFS からワークスペースにファイルを取得しようとしている場合は、少し異なります。

        VersionControlServer sourceControl = coll.GetService<VersionControlServer>();

        var ws = sourceControl.QueryWorkspaces(workspaceName, null, null);

        var status = ws[0].Get();

(これにエラー処理を追加する必要があります)

これにより、サーバーからのファイルでワークスペースが更新されます。現在ディスク上にあるものとリポジトリにあるものを比較し、新しいバージョンが存在する場合はローカル バージョンを更新するという点で、Visual Studio UI と同じように機能します。

Get() メソッドには、探している正確な動作を指定するために使用できるオーバーロードが多数あります。

- 編集 -

Workspace.Get() を呼び出すと、最初に (Web サービス呼び出しを使用して) TFS に移動し、ファイルのリストを取得します。次に、それらのファイルを繰り返し処理し、そのワークスペースで既に「取得」したものと、要求したリビジョン (または他のリビジョンを指定しなかった場合は VersionSpec.Latest) の内容を比較します。

このプロセスには時間がかかる場合があります。これは、ワークスペース内のマップされたすべてのディレクトリを右クリックして最新のものを取得するのと同じです。

ワークスペースが にマップされて$/いる場合、TFS 内のすべてのファイルを反復処理します。ローカル パスへのパスのマッピングが複数ある場合は、それぞれを通過し、まだ​​取得していないファイルをローカルに取得して保存します。

マップした内容に注意しないと、ワークスペース全体を更新すると非常に長い時間がかかることがあります。

-- 編集 2 --

得られるものを制限したい場合は、いくつかのオプションがあります。最初のオプションは、アクセスしているワークスペース内でマッピングを制限することです。たとえば、ワークスペースに へのマッピングが 1 つしかない場合$/Project/Branch/Source/Utilities/MyUtility、そのマッピング内のファイルのみが取得されます。

いくつかの社内ユーティリティでは、次のことまで行っています。

  • ワークスペースを動的に作成する
  • 取得する必要があるパスのみのパスをディレクトリにマップします
  • ゲットする
  • 特定のファイルを編集する (PendEdit() メソッドを使用)
  • 変更されたファイルをチェックインする
  • 最後に、ワークスペースを削除します

一連のファイルの更新を自動化しようとしているだけの場合、これは大変な作業になるため、Get()メソッドへのパスを渡すことができます。

var status = ws[0].Get(new GetRequest("$/path/to/subfolder", RecursionType.Full, VersionSpec.Latest),
                   GetOptions.Overwrite);
于 2011-02-11T13:50:15.190 に答える
2

TFS コマンド ライン ツールを使用する場合、同じコマンド/パラメーターが機能しますか? 例えばTF.exe get

ウィルス対策ソフトはインストールしていますか?邪魔になっている可能性はありますか?一時的に無効にしてみてください。

また、app.config で TFS クライアント側トレースを有効にして、ネットワーク上で何が起こっているかを確認することもできます: http://blogs.msdn.com/b/edhintz/archive/2007/03/30/tfs-client-tracing。 aspx

于 2011-02-10T16:04:39.317 に答える
0

以下は、サーバーパスから最新バージョンのコードを取得できる実際の例です

var status = workspace.Get(new GetRequest("$/XXXX/Development/Subfolder/",
            RecursionType.Full, VersionSpec.Latest),
            GetOptions.GetAll| GetOptions.Overwrite);
于 2014-01-29T09:16:24.387 に答える