2009-07-04 6 views
1

SVN 1.6では、コミットがマージされた場所を追跡できますか?私はUIベースのソリューションで特に興味深いです(Eclipseプラグインは素晴らしいでしょう)。SVN:トラックマージ

+0

「コミットをマージする」という概念は、サブバージョンでは100%機能しないため、少し具体的にする必要があります。 – balpha

+0

私はカップルブランチでマージする必要があるコミットを持っています。後で私は、コミットがどのブランチ(どこと誰)がマージされたかを知りたい。これは反対の方法で動作します(マージされたコミットはその起源を示します)。 – FoxyBOA

+1

SVNとのマージとマージの難しさは、私たちがP4に切り替えた理由です。あなたの最善の策は、リポジトリ全体の変更された行のgrepだけで、それがどのブランチに表示されるかを確認することです。 –

答えて

1

ありがとうございます(derobertJim Tに感謝します)。私は、私が必要としていることを行うsvnkit 1.2.xを使って私自身のコードを書いています。

private static void showMergedRevision(String pFromUrl, String pToUrl) throws SVNException { 
    List<String> folders= new ArrayList<String>(); 
    folders.add("Folder1"); 
    ... 

    SVNRepositoryFactoryImpl.setup(); 

    String name="user"; 
    String password="password"; 

    ISVNOptions options = SVNWCUtil.createDefaultOptions(true); 

    ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password); 

    SVNClientManager ourClientManager = SVNClientManager.newInstance(options , authManager); 

    final Set<Long> mergedRevision = new HashSet<Long>();   
    for(String folder : folders){ 
     SVNURL svnFrom = SVNURL.parseURIDecoded(pFromUrl + "/" + folder); 
     SVNURL svnTo = SVNURL.parseURIDecoded(pToUrl+ "/" + folder); 
     ISVNLogEntryHandler mergedLogger = new ISVNLogEntryHandler() { 
      public void handleLogEntry(SVNLogEntry pParamSVNLogEntry) throws SVNException { 
       mergedRevision.add(pParamSVNLogEntry.getRevision()); 
      } 
     }; 
     ourClientManager.getDiffClient().doGetLogMergedMergeInfo(svnTo, SVNRevision.HEAD, svnFrom, SVNRevision.HEAD, false, null, mergedLogger); 
    } 

    System.out.println(String.format("Tracking merges from [%s] to [%s].", pFromUrl, pToUrl)); 
    System.out.println("Comparing folders: " + folders); 

    SVNURL svnUrlorg = SVNURL.parseURIDecoded(pFromUrl); 
    ISVNLogEntryHandler histroyLogger= new ISVNLogEntryHandler() { 
     public void handleLogEntry(SVNLogEntry pParamSVNLogEntry) throws SVNException { 
      if (pParamSVNLogEntry.getRevision() < 0){ 
       // Sometimes got -1 null null null values. Skip them 
       return; 
      } 
      final boolean merged = mergedRevision.contains(pParamSVNLogEntry.getRevision()); 
      System.out.println(String.format("%s %s: %s %s %s", merged ? "[+]": "[-]", 
        pParamSVNLogEntry.getRevision(), 
        pParamSVNLogEntry.getAuthor(), pParamSVNLogEntry.getDate(), 
        pParamSVNLogEntry.getMessage())); 
     } 
    }; 
    ourClientManager.getLogClient().doLog(svnUrlorg, null, SVNRevision.HEAD, SVNRevision.create(0), SVNRevision.HEAD, true, false, false, -1, null, histroyLogger); 
} 

出力は次のようになります

[ - ] 7210:ボア2009年3月7日
[ - ] 7211:ボア2009年3月7日
[+] 7215:ボア2009年3月7日

[+]は、マージされたリビジョン、[ - ] - unmergedを意味します。

10

私はかつてこのようなかなりのWebページを書いていました。私は残念ながら、あなたにページを与えることはできませんが、私はあなたに私がしたことのアイデアを与えることができます。

最初に私たちの開発モデル - すべての開発をトランクにして、リビジョンをさまざまなバージョンの製品のさまざまなリリースブランチにマージします。

各バージョンの列と各トランクリビジョンの行を持つWebページを設定しました。 各列に対してsvn mergeinfoを実行すると、そのバージョンにマージされたトランクリビジョンのリストが返されました。

私たちは、これらの機能比較リストと非常によく似たものになりました。対応するトランクコミットを含む各バージョンの黒い点を示す表です。

は少しこのように見えた:

rev | ver1 | ver1.1 | ver2 | ver2.1 | 
200 |  |   |  | X | 
198 |  | X  |  | X | 
177 |  |   |  | X | 
176 |  |   | X | X | 
157 | X | X  | X | X | 
146 | X | X  | X | X | 
122 | X | X  | X | X | 
075 | X | X  | X | X | 

を。これは、任意のリビジョンが別の場所にマージされますがされていない場合、私たちは(テスト用に便利)の各バージョンが含まれている正確に何を見るだけでなく、強調してみましょう。

+1

+1とても良いアイデアです。 svn mergeinfotable -r 200:75 - ソースリポジトリ/ブランチ、誰のための機能要求? – balpha

+0

+1私はこのようなものをチームのために作りました。アイデアを共有してくれてありがとう。 – xkcd150

2

Eclipseプラグインを使用する場合は、Subclipseを試してみてください。それは本当に使いやすく、競合するファイルやブランチ、マージブランチなどをマージする際にとても役に立ちました。 ここにいくつかはscreenshotsです。