2012-05-29 114 views
2

我一直在使用git-svn與我公司的svn repo進行溝通,現在沒有任何重大的麻煩。`git svn dcommit`在分支上失敗

如今,「頭痛」雙組分發生了巨大變化:
我一直在努力master/trunk專門漂亮,並且需要合併最(!但不是全部)的這些變化集到一個新的SVN分支,源自一個預先存在的svn分支。

基本上這樣的:

-----------1--1-----1--------1--1--1--- master/trunk 
\ 
    \ 
    2--2--2--2--2          versioned-release 

本來應該成爲這樣的:

-----------1--1-----1--------1--1--1--- master/trunk 
\ 
    \ 
    2--2--2--2--2          versioned-release 
         \ 
          \ 
          1--1--1--1--1--1   new-versioned-release 

是提交不應該在new-versioned-release,並x從各個分支x想要的提交。

所以我做了以下內容:

  1. git checkout -b versioned-release-svn remotes/versioned-release
  2. git svn branch new-versioned-release -m "Preparing for merge of XXX"
  3. git checkout -b new-versioned-release-svn remotes/new-versioned-release
  4. git cherry-pick ...爲每1,解決在路上的任何衝突。

因爲我想確定我是真的要針對在回購正確的分支,然後我就跑git svn dcommit --dry-run這並不會產生任何錯誤或警告,但他告訴我...

Committing to svn://[email protected]$repo-host/$repo-name/$path/branches/new-versioned-release ... 

...接着是幾條diff-tree行。

所以我試圖忽略--dry-run和中途的提交結束了......

Item already exists in filesystem: File already exists: filesystem '/data/subvroot/$repo-name/db', transaction '20856-g3m', path '/$path/branches/new-versioned-release/some-directory' at /usr/libexec/git-core/git-svn line 862 

...和不分階段的變化一堆

除了明顯的 - 和「我如何擺脫這種混亂不失一切我做?」 - 我有兩個問題:「跆拳道?!?」:

  1. 假設我之前是回git svn dcommit:如何讓我的本地分支dcommit到達其計劃目的地?
  2. 現在看來很明顯,這不是實現我想要的東西的正確方法......但是應該怎麼做呢?

的一切,我發現了錯誤信息,不知何故類似於我的情況,到目前爲止是this other stack overflow question和建議的解決方案「在某種程度上[...]吹走.git/svn元數據目錄」不共振相當和我一起...

回答

0

有人剛剛投了我的老問題,所以我想我會分享我現在怎麼做。

它工作得很好。

假設Git倉庫已經使用

git svn clone \ 
    --prefix svn/ \ 
    --stdlayout \ 
    svn://[email protected]$repo-host/$repo-name/$path 
    $git_repo_name 

變化到git倉庫創建的,並有運行

git checkout svn/versioned-release 
git svn branch new-versioned-release 

這將導致SVN服務器上的以下病史:

-----------1--1-----1--------1--1--1--- trunk 
\ 
    \ 
    2--2--2--2--2          versioned-release 
          \ 
          \ 
          3⭐️         new-versioned-release 

現在我運行

git checkout svn/new-versioned-release 
git checkout -b new-versioned-release 

# resulting in the following **local** history: 
# 
# -----------1--1-----1--------1--1--1--- master (tracks 'svn/trunk') 
# \ 
# \ 
# 2--2--2--2--2--3⭐️       new-versioned-release (tracks 'svn/new-versioned-release') 

這是實現我想要的基礎。

還有一個提交,因爲SVN中的分支與Git中的分支不一樣:創建分支總是意味着一個新的修訂(又名commit),這就是3⭐️的來源。這並不重要,但它在那裏。

我現在可以git cherry-pick所有1 S,這個地方的歷史結束了:

-----------1--1-----1--------1--1--1--- master (tracks 'svn/trunk') 
\ 
    \ 
    2--2--2--2--2--3⭐️--1--1--1--1--1--1 new-versioned-release (tracks 'svn/new-versioned-release') 

當我現在git svn dcommit,而坐在在Git中new-versioned-release,SVN服務器上的歷史看起來像什麼,我想結束:

-----------1--1-----1--------1--1--1--- trunk 
\ 
    \ 
    2--2--2--2--2          versioned-release 
          \ 
          \ 
          3⭐️--1--1--1--1--1--1 new-versioned-release 

唯一的區別在於額外3⭐️從創建第三SVN分支。