4

DLL にコンパイルされる TFS に Visual Studio C# プロジェクトがあります。プロジェクト内のファイルが一定期間変更されたかどうかを知る必要があります。このようなもの:

"from date 01/01/2011 to today,  check if the project has been modified."

C# で TFS API を使用してこれを行う最善の方法は何ですか?

私の考え: TFS からすべてのプロジェクト アイテムを取得し、各アイテムの変更履歴を確認します。指定された範囲期間に従って履歴をフィルタリングします。その期間に変更があった場合、そのファイルは変更されたため、プロジェクトが変更されました。これは正しいです?

同じことを行うことは可能でしょうか?ただし、一定期間を検索するのではなく、チェンジセットの範囲内で検索することはできますか? 例えば:

"from changeset 1071 to latest,  check if the project has been modified."
4

3 に答える 3

3

QueryHistoryこのメソッドは、次の種類の質問に使用できます。

var tfs = new TfsTeamProjectCollection(new Uri(@"http://tfs.example.com:8080"));
var vc = tfs.GetService<VersionControlServer>();

// DateTime fro, to;
var changesets = from cs in vc.QueryHistory(
    "$/YourProject",
    VersionSpec.Latest,
    0,    /* deletion ID, 0 otherwise */
    RecursionType.Full,
    null, /* user, null for all */
    null, /* from changeset, null because these aren't by date */
    null, /* to changeset, null because these aren't by date   */
    Int32.MaxValue, /* get them all */
    false, /* just metadata */
    false /* just the current stuff */
    )
    where cs.CreationDate >= fro && cs.CreationDate <= to
    select cs;

変更セットのリストを取得したら、それらに関連付けられているファイルを照会できます。この時点で、偽陽性を本当に除外したい場合は、プロジェクトとソリューションを読み取るためのRoslynサポートを追加し、それを使用して興味深いファイル名をフィルター処理します。

于 2012-12-14T20:40:43.017 に答える
2

ここで発生する問題は、プロジェクトに同じルート フォルダーにないファイルが含まれている可能性があることです。大規模なソリューションでは、プロジェクト ディレクトリの外にあるファイルを含めるのが一般的です。

直面するもう 1 つの問題は、プロジェクト ディレクトリの下にあるソース管理のすべてのファイルを実際にプロジェクトに含める必要がないことです。

これらのケースを気にしない場合、これを行う最も簡単な方法は、tf コマンド ライン tf folderdiff を使用することです。2 つのパス (両方ともサーバー上にある可能性があります) を渡すことができます。ドキュメントでは明確に指定されていませんが、次のように versionspec を追加できます。

 tf folderdiff $/Path/To/Project;C1071 $/Path/To/Project;T /recursive

追加できるものの例は、こちらに記載されています。日付、変更セット番号、ラベル名などが含まれます。

これがどのように行われるかを知りたい場合は、Reflector.NET または JustDecompile (または同様のアプリケーション) で tf.exe ユーティリティを表示することを検討してください。彼らはあなたと同じ API を使用します。tf folderdiffまたは、Process クラスを使用してコマンドを直接呼び出すだけです。

tf folderdiff コマンドとその使用方法についてもう少し説明したブログ投稿があります。

魔法を保持するクラスは次のとおりです。

 internal class FolderDiff : IEnumerable<FolderDiffFolder>, IEnumerable, IDisposable

 Name:     Microsoft.TeamFoundation.VersionControl.Controls.FolderDiff 
 Assembly: Microsoft.TeamFoundation.VersionControl.Controls, Version=11.0.0.0 

これは内部的なものなので、どのように行われたかを覗くことができますが、API に簡単にアクセスして同じ結果を得ることはできません。

于 2012-12-14T19:33:55.030 に答える
0

基本的には良いスタートなので、@Alexが回答を削除した理由はよくわかりません。

彼が提案したように、 tf.exe を実行して、ファイルまたはフォルダー階層全体の履歴を取得し、結果を 2 つのバージョン、変更セット、または日付の間に制限することができます。したがって、プロジェクトが「通常」で、ほぼすべてが 1 つのルート フォルダーにある場合、単純な方法はtf history、ルート フォルダーで変更されたファイルのリストを取得することです。出力を解析して影響を受けるファイルを特定する必要がありますが、これは非常に簡単な作業です。「何か変更があったかどうか」だけを知りたい場合はさらに簡単です。

@jessehouwig が言うように、他の場所から考慮したいファイルと、考慮したくないプロジェクト フォルダー内のファイルが存在する可能性があります。この場合、より具体的な方法で情報を収集するために、tf.exe を複数回呼び出すバッチ ファイルまたはアプリケーションを作成することができます。

于 2012-12-14T19:55:22.550 に答える