2013-03-22 71 views
5

我正在使用SVN,並有一個穩定的生產分支和不穩定的主幹。 對於每個版本,我們都會從樹幹中挑選要合併到生產中的物品。可以Git SVN工作svn mergeinfo - 顯示合格的

我用git svn克隆了我的SVN回購庫,這樣我就可以更快地搜索我需要合併的提交(因爲我在提交消息中搜索JIRA id)。但是,我仍然在svn merge的合併結束。

這個長壽命生產分支的問題之一是有可能在樹幹留下的提交沒有合併。

爲了解決這個問題我偶爾運行:

svn mergeinfo --show-revs eligible https://my.server/svn/trunk https://my.server/svn/branches/PROD_V3.00

然而,這實在是太慢了。 Git中相當於是

git log prod..master

不過,這似乎只是列出所有提交。

這是由於git不承認svn合併和svn:mergeinfo屬性?

有沒有什麼辦法讓我快速獲得符合條件的提交使用git?

編輯:

我試過喬斯的答案,但是,git cherry只輸出SHA,我需要SVN修訂做了合併。 因此,我不得不通過git svn find-rev來找到SVN ID來獲得我需要的東西。

git cherry prod master|cut -d' ' -f2|while read -r line; do git svn find-rev "$line"; done;

不幸的是,這是比svn mergeinfo --show-revs eligible慢。

+1

如果你已經有SHA並且不想調用'git svn find-rev',你可以嘗試從提交消息中挖掘svn修訂版本,通常由git-svn添加,例如, 'git cherry prod master |剪下-d''-f2 |同時讀取-r行;做git show -s --format = format:「%b」「$ line」| grep git-svn-id;完成;' – 2014-12-13 17:28:16

回答

3

如果提交已被挑選出來,那麼您現在有兩個提交副本。即使他們有prod的副本,Git也會向您顯示master中的所有提交。

等效大概是:

git cherry master prod 

它會告訴你在master沒有出現已櫻桃採摘到prod任何承諾。

1

如果你完全可以使用Perl,那麼git-svn只是一個大的perl腳本,而git svn find-rev是該perl腳本中的一個函數。你可以使用它來編寫代碼,避免每次都讀取rev_map文件。

所以,我在想什麼是這樣的:

git cherry prod master|cut -d' ' -f2|while read -r line; do git svn find-rev "$line"; done 

變爲更多的東西像這樣(不完整,尚未運行B/C我不再有一個git-svn的回購):

#!/usr/bin/perl 

use Carp; 
use Git::SVN; 
# use ...the rest of the Git::SVN module... 

# ...initialize whatever is necessary... 

open(ELIGIBLE_COMMITS, "git cherry prod master") || croak "Couldn't do git cherry"; 
while (<ELIGIBLE_COMMITS>) { 
    ($ignore, $sha1) = split; 
    my (undef, $rev, undef) = cmt_metadata($sha1); 
    print "$rev\n"; 
} 
close(ELIGIBLE_COMMITS); 

您也可以考慮只修改git-svn腳本的cmd_find_rev採取的其他選項指定多個版本找到,例如,

find-rev --file <filename> 

其中filename可以是「 - 」來指定STDIN。

+0

有趣。你是不是說多管齊下找到rev是瓶頸? – 2014-12-22 14:53:22

+1

我不知道它是否是瓶頸,但是由於可移植性的原因,在git-svn的映射中發生的大部分事情並不快。作爲將一個相當巴洛克式的SVN repo佈局移動到git的一部分,我在一年半前做了一些調查。 – 2014-12-22 21:04:59