17

これは、TFS2010と変更ログを作成する可能性についての私の以前の質問に続くものです。

以前はラベルを使用してプログラムのバージョンを識別していましたが、ラベルは特定の時点では固定されていないため、現在はブランチを使用しています。

ブランチ階層は次のようになります。

ブランチ階層

ご覧のとおり、トランクのブランチである2つの異なるアプリケーションがあります:(APP_AアプリケーションA)とAPP_B(アプリケーションB)。どちらもほぼ同じですが、機能上の違いがいくつかあります。

アプリケーションの新しいバージョン(たとえばバージョン1.3)を作成するプロセスは次のとおりです。

  1. が変更されましたMain trunk(新しい機能が追加され、バグが修正されました...)
  2. 変更されたものMain trunkから、新しいブランチが作成されます。Main trunk 1.3
  3. APP_Aブランチが変更される可能性があるため、の固有の機能APP_Aはv1.3の変更で機能します
  4. APP_Bブランチが変更される可能性があるため、の固有の機能APP_Bはv1.3の変更で機能します
  5. Main trunk 1.3APP_Aとにマージされるため、とアプリケーションのAPP_B両方がの変更を受け取りますAPP_AAPP_BMain trunk
  6. 変更されたAPP_Aブランチから、新しいブランチが作成されます。APP_A_1.3
  7. 変更されたAPP_Bブランチから、新しいブランチが作成されます。APP_B_1.3

APP_A_1.3私の目標は、との間の変更ログを作成できるようにすることAPP_A_1.2です。

変更ログとは、WorkItemのリストを意味します。チェックインされる各チェンジセットは、1つ以上のワークアイテム(たとえば、バグアイテム)に関連付けられています。影響を受けたチェンジセットにリンクされたすべての作業項目のリストを取得できるようにしたいと思いますAPP_A_1.3。これらのチェンジセットは、Main trunk(上記のステップ1)、APP_A branch(上記のステップ3)、またはAPP_A_1.3ブランチ自体(ホットフィックスがブランチが作成された後にチェックインされます)。

この作業項目のリストを取得するために、「リンク」されているすべてのチェンジセットのリストAPP_A_1.2「リンク」=チェンジセットにチェックインされたコードがブランチにあるAPP_A_1.2)と、に「リンク」されていAPP_A_1.3ます。

そうすれば、どのチェンジセットがに「リンク」されているのか、「リンク」されAPP_A_1.3ていないのかを知ることができますAPP_A_1.2。この変更セットのサブセットから、関連するすべてのWorkItemを取得し、変更ログを取得します。

これが私の問題です。指定されたブランチに「リンク」されているすべてのチェンジセットのリストを取得するにはどうすればよいですか?C#コードにTFS2010APIを使用しています。

私のプログラムの入力(指定されたブランチのすべてのチェンジセットを取得する)はブランチの名前(たとえばAPP_A_1.2)になり、出力は次のチェンジセットのリストになります。

  • APP_A_1.2ブランチ自体に適用されるチェンジセット
  • 作成APP_A前にブランチに適用されたチェンジセットAPP_A_1.2
  • Main trunk 1.2にマージされる前にブランチに適用されたチェンジセットAPP_A
  • 作成Main trunk前にブランチに適用されたチェンジセットMain trunk 1.2

これらすべてのチェンジセットを取得するために、次のコードを記述しました。

// Gets the list of all changesets ID from APP_A_1.2 branch
var branch1ChangeSets = myVersionControlServer.QueryHistory(
    "$/PATH/APP_A_1.2/",
    VersionSpec.Latest,
    0,
    RecursionType.Full,
    null,
    null,
    null,
    int.MaxValue,
    false,
    false).OfType<Changeset>().Select(z => z.ChangesetId).ToList();

指定されている場合でもRecursionType.Full、上記のコードはブランチ自体にチェックインされたチェンジセットのみを返します。APP_A_1.2これは、VisualStudioのソースコードエクスプローラービューの[履歴]コマンドと同じです。

次に、次のコードを試しました。

// Gets the list of all changesets ID from APP_A_1.2 branch
var branch1MergedChangeSets = myVersionControlServer.QueryMerges(
    null,
    null,
    "$/PATH/APP_A_1.2/",
    VersionSpec.Latest,
    null,
    null,
    RecursionType.Full).Select(z => z.SourceVersion).ToList();

APP_A_1.2これにより、ブランチでチェックインされたチェンジセットと、作成APP_A前にブランチでチェックインされたチェンジセットが返さAPP_A_1.2れます。はるかに優れていますが、十分ではありません。APP_A(私の場合) 「上」にあるブランチで再帰を機能させる方法が見つかりませんMain trunk...

誰かアイデアがありますか?

また、2つのブランチ間の変更ログを取得するためのより良いアイデアは大歓迎です...Thx。

4

3 に答える 3

3

まず、最初に1つの質問をさせてください。投稿の上部に次のように書いています。「私の目標は、APP_A_1.3とAPP_A_1.2の間の変更ログを作成できるようにすることです。」

ただし、具体的に探している変更を書き込むと、リストが表示されます。APP_A_1.2ブランチ自体に適用されたチェンジセットAPP_A_1.2が作成される前にAPP_Aブランチに適用されたチェンジセットAPP_Aにマージされる前にメイントランク1.2ブランチに適用されたチェンジセット適用されたチェンジセットメイントランク1.2が作成される前のメイントランクブランチ

これは、APP_A_1.3、APP_A_1.2、1.1などに貢献したすべての変更をリポジトリの先頭に与えるため、有効なリストではありません。

現在、アプローチをテストすることはできませんが、これを実行します。-QueryHistoryを使用して、すべての変更をブランチ1.3に直接チェックインします。-QueryMergesExtendedを使用して、このブランチへのマージを追跡します。QueryMergesExtended(http://msdn.microsoft.com/en-us/library/ff736485.aspx)は、ブランチ視覚化ツールをサポートするために、特にQueryMergesおよびQueryMergesWithDetailsよりもはるかにパフォーマンスと堅牢性を高めるためにTFS2010に追加されました。ブランチのルートでマージをクエリするため、QueryMergesExtendedでオプションFollowRenamesを指定する必要はありません。(APP_Aから)ソース変更のリストを取得するときに、各変更セットをチェックして、マージ変更が含まれていることを確認する必要があります。その場合、それらのチェンジセットについてapp_aでマージをクエリする必要があります。ブランチ階層全体を歩くまで、再帰的に実行します。

サイドトピックでは、後で、ブランチオブジェクトリストを紹介するQueryMergeRelationships(http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.versioncontrolserver.querymergerelationships.aspx )を確認できます。 tfs 2010の場合(これは、ソース管理エクスプローラーでフォルダーを選択し、[ブランチに変換]をクリックしたときに発生します)。ただし、必要のない方法とは異なる方法(ハードコーディング)でブランチを検出できる場合。

お役に立てれば!

于 2012-02-27T10:26:39.033 に答える
2

私はついに簡単な解決策を思いついた。実際にはブルートフォースアルゴリズムのように見えるので、私は完全に満足しているわけではありませんが、少なくともそれは機能します。

私がしていることは:

1)TFSブランチのルート(つまり、の「親パス」)に適用されているすべてのチェンジセットのリストを取得します。Main Trunk

var allChangesets = vcs.QueryHistory(
    "MySourcePath",
    VersionSpec.Latest,
    0,
    RecursionType.Full,
    null,
    firstPossibleChangeset,
    VersionSpec.Latest,
    int.MaxValue,
    true,
    false).OfType<Changeset>().ToList();

2)取得したチェンジセットごとにTrackMerges、チェンジセットがブランチに何らかの影響を与えるかどうかを確認するために呼び出します。TrackMerges関数のパラメーターとして指定したブランチに指定されたチェンジセットが適用されているかどうかを教えてくれます(これらのブランチのターゲットチェンジセットIDを返します)。チェンジセットがAPP_A_1.3ソースブランチ(APP_A_1.2)ではなく宛先ブランチ(私の場合)に適用されている場合、それは間違いなく私のAPP_A_1.3ブランチで何か新しいことを意味します。

List<int> newChangesets = new List<int>();
foreach (var z in allChangesets.Where(y => y.ChangesetId > firstPossibleChangesetId))
{
    var zz = vcs.TrackMerges(
        new int[] { z.ChangesetId },
        new ItemIdentifier("THE TRUNK PATH"),   // The root of all branches
        new ItemIdentifier[] { new ItemIdentifier(fromBranchPath), new ItemIdentifier(toBranchPath) },
        null);

    var targetInFromBranch = zz.Where(t => t.TargetItem.Item == fromBranchPath).FirstOrDefault();
    var targetInToBranch = zz.Where(t => t.TargetItem.Item == toBranchPath).FirstOrDefault();

    if (targetInToBranch != null && targetInFromBranch == null)
    {
        // Then the changeset is only applied on the ToBranch
        newChangesets.Add(z.ChangesetId);
    }
}

3)「新しいチェンジセット」のリストからチェンジログ(作業項目のリスト)を取得するのは非常に簡単です。

// Now, gets associated work items!
Dictionary<int, WorkItem> dico = new Dictionary<int, WorkItem>();
foreach (int changesetId in newChangesets)
{
    foreach (WorkItem zz in vcs.GetChangeset(changesetId).WorkItems)
    {
        this.AddWorkItemToDicRecursive(wis, dico, zz);
    }
}

private void AddWorkItemToDicRecursive(WorkItemStore wis, Dictionary<int, WorkItem> dico, WorkItem workItem)
{
    if (!dico.ContainsKey(workItem.Id))
    {
        dico.Add(workItem.Id, workItem);

        foreach (WorkItemLink associatedItem in workItem.WorkItemLinks)
        {
            this.AddWorkItemToDicRecursive(wis, dico, wis.GetWorkItem(associatedItem.TargetId));
        }
    }
}

最善のアプローチではないと思いますが、問題なく機能し、シンプルなままです。また、何もハードコーディングする必要がなかったので(ブランチ名/階層)、それほど悪くないIMOです。それが誰かを助けることを願っています。

于 2012-03-02T16:50:16.737 に答える
1

ええ、私自身もこの問題に取り組んでいます。とにかく、ラベルを比較しているときに、それを解決するcodeplexプロジェクトを見つけました。

これが役立つかどうかを確認してください:http://tfslabeldiff.codeplex.com/SourceControl/changeset/view/7075#158224

これを見つけるのがどれほど難しいかはかなり驚きましたが、TFSのドキュメントはせいぜい不足しています。当たり前のようでした!

于 2012-02-29T07:20:55.753 に答える