2013-07-27 56 views
0

我的git repo正在跟蹤SVN回購。我的一個git分支,我們稱其爲'latest_tag',指向源代碼,因爲它在最新的SVN標籤中。當創建一個新的SVN標籤時,我想合併'latest_tag'中的更改。當我嘗試這樣做時,git抱怨合併衝突,好像它不瞭解SVN歷史。git丟失SVN標籤之間的歷史記錄

SVN回購正在使用標準結構。

trunk/ 
tags/ 
- v1 
branches/

我以通常的方式創建了我的git repo。

git svn clone --stdlayout url_to_svn_repo git_repo 

我爲每個SVN標籤和'latest_tag'分支創建了git分支。

git branch v1 tags/v1 
git branch latest_tag v1 

當一個新的標籤在SVN回購的增加(例如V2),我可以在我的git回購導入。

git svn fetch 
git branch v2 tags/v2 

但是,如果我嘗試將'latest_tag'分支從v1快速轉發到v2,則出現錯誤。

$ git checkout latest_tag 
$ git merge v2 
Auto-merging source.py 
CONFLICT (add/add): Merge conflict in source.py 
Automatic merge failed; fix conflicts and then commit the result. 

當我看到衝突,它看起來像混帳認爲是無關的V1和V2之間的所有變化,但他們有一個共同的歷史。

這是一個重現問題的最小化腳本。

# Create the svn repo and its first tag. 
svnadmin create svn_repo/ 
svn checkout "file:///${PWD}/svn_repo/" svn_working_copy 
(cd svn_working_copy ; mkdir -p trunk tags branches ; svn add * ; svn commit -m 'Initialize SVN repo' ; cd trunk ; echo "print 'Hello v1'" >source.py ; svn add * ; svn commit -m 'Development for v1' ; cd .. ; svn cp trunk/ tags/v1 ; svn commit -m 'Tag v1' ; sed --in-place 's/v1/v2/' trunk/* ; svn commit -m 'Development for v2' ;) 

# Create a git repo from the svn repo. 
git svn clone --stdlayout "file://${PWD}/svn_repo/" git_repo 
(cd git_repo ; git branch v1 tags/v1 ; git branch latest_tag v1) 

# Create tag v2 in svn. 
(cd svn_working_copy ; svn cp trunk/ tags/v2 ; svn commit -m 'Tag v2') 

# Merge or rebase 'latest_tag' git branch on svn tag v2. 
(cd git_repo ; git svn fetch ; git branch v2 tags/v2 ; git checkout latest_tag ; git merge v2) 

編輯 我確認混帳似乎也沒有兩個SVN標籤之間的共同歷史感。

$ git log --oneline master 
bd050cd Development for v2 
373f808 Development for v1 
3b92703 Initialize SVN repo 
$ git log --oneline remotes/tags/v1 
31f9fff Tag v1 
3b92703 Initialize SVN repo 
$ git log --oneline remotes/tags/v2 
b717759 Tag v2 
3b92703 Initialize SVN repo 

如果git瞭解SVN的歷史,它會輸出這個。

$ git log --oneline remotes/tags/v1 
31f9fff Tag v1 
373f808 Development for v1 
3b92703 Initialize SVN repo 
$ git log --oneline remotes/tags/v2 
b717759 Tag v2 
bd050cd Development for v2 
373f808 Development for v1 
3b92703 Initialize SVN repo 

回答

1

我發現爲什麼git似乎沒有svn歷史的感覺。答案是:這取決於你如何創建你的svn標籤。

看看svn的歷史,我看到svn標籤是作爲各種版本的文件組合創建的,而不是創建爲給定版本的快照。

$ svn log -v 
------------------------------------------------------------------------ 
r3 | lacton | 2013-07-27 18:15:20 | 1 line 
Changed paths: 
    A /tags/v1 (from /trunk:1) 
    A /tags/v1/source.py (from /trunk/source.py:2) 

Tag v1 
------------------------------------------------------------------------ 

儘管svn似乎對此非常滿意,但git-svn會因此而感到困惑。

在創建標籤之前添加svn update可以解決此問題。

$ svn up 
At revision 2. 
$ svn cp trunk/ tags/v1 
A   tags/v1 
$ svn commit -m 'Tag v1' 
Adding   tags/v1 

Committed revision 3 
$ svn up 
At revision 3. 
$ svn log -v -r HEAD 
------------------------------------------------------------------------ 
r3 | lacton | 2013-07-27 18:20:26 | 1 line 
Changed paths: 
    A /tags/v1 (from /trunk:2) 

Tag v1 
------------------------------------------------------------------------ 

通過此修復,git-svn正確解釋了svn標記歷史,並且不再存在合併衝突。

下面是與初始問題一起提供的最小腳本的「git-friendly」版本(即,在標記創建之前使用svn update)。

# Create the svn repo and its first tag. 
svnadmin create svn_repo/ 
svn checkout "file:///${PWD}/svn_repo/" svn_working_copy 
(cd svn_working_copy ; mkdir -p trunk tags branches ; svn add * ; svn commit -m 'Initialize SVN repo' ; cd trunk ; echo "print 'Hello v1'" >source.py ; svn add * ; svn commit -m 'Development for v1' ; cd .. ; svn up ; svn cp trunk/ tags/v1 ; svn commit -m 'Tag v1' ; sed --in-place 's/v1/v2/' trunk/* ; svn commit -m 'Development for v2' ;) 

# Create a git repo from the svn repo. 
git svn clone --stdlayout "file://${PWD}/svn_repo/" git_repo 
(cd git_repo ; git branch v1 tags/v1 ; git branch latest_tag v1) 

# Create tag v2 in svn. 
(cd svn_working_copy ; svn up ; svn cp trunk/ tags/v2 ; svn commit -m 'Tag v2') 

# Merge or rebase 'latest_tag' git branch on svn tag v2. 
(cd git_repo ; git svn fetch ; git branch v2 tags/v2 ; git checkout latest_tag ; git merge v2) 
相關問題