2009-07-04 57 views
1

SVN 1.6有可能跟蹤提交合並的位置。我基於UI的解決方案尤其有趣(Eclipse插件將會很棒)。SVN:軌道合併

+0

你必須更具體一點,因爲「合併提交」的概念在Subversion中不起作用。 – balpha 2009-07-04 18:12:59

+0

我有一個提交,必須在幾個分支合併。後來我想知道提交合並的分支(哪裏和哪個分支)。它以相反的方式工作(合併的提交顯示它的原點)。 – FoxyBOA 2009-07-04 18:15:23

回答

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日BOA

[+]表示合併修訂,[ - ] - 未合併。

10

我曾經寫過一個相當類似這樣做的網頁。不幸的是,我不能給你這個頁面,但我可以告訴你我做了什麼。

首先我們的開發模式 - 所有的開發都是針對主幹進行的,然後將修訂合併到不同版本的產品的各個發佈分支中。

我設置了一個網頁,每個版本的一列和每個中繼版本的一行。 通過爲每列運行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 | 

這讓我們看看到底是什麼每個版本包含(用於測試),以及突出如有版本被合併到一個地方而不是另一個。

2

如果你想使用Eclipse插件,你可以試試Subclipse。它非常易於使用,並且對合並衝突文件和分支,合併分支等非常有用。 以下是一些screenshots