2010-06-29 52 views
12

我正在使用來自OpenSource項目的代碼的項目。其中一個要求是儘可能多地將代碼推回到上游。與SVN上游同步工作

遠程項目使用Subversion(不是很好)。

我目前的設置是這樣的:

[Remote SVN] (git svn fetch)-> [My public Git] <-(push/pull)-> [My dev. Git] 
            VV 
            (pull) 
            VV 
           [Testing grid] 

EDIT 11.7。 - 重新提出了問題

我的問題是我的本地公共回購和svn上游並存。

我必須提供3個公共分支:

  • 保守穩定
  • 實驗穩定
  • 發展

這些分支現在是線性的(發展成爲實驗穩定和實驗變得保守) ,但目標是合併的標準3頭方法。由於它們的公共性質,我不能重新分配這些分支。

現在完全正交於此我試圖以某種方式使向上遊發送補丁更容易。從我的分支挖出它們很慢並且容易出錯。

我目前典型的工作流程是:

  • 落實在上面開發分支的一些功能
  • 測試&修復功能
  • 測試&解決這個新特性(實際上發生了很多)
  • 破碎等特點
  • 確定這是否可以在上游接受或不接受(30:60是:否)
  • 對此做些事情(我們只是寫一個新的TODO)

上游的另一個問題是,他們接受補丁到不同的分支(我的公共分支是基於他們的穩定分支)。一旦補丁達到穩定分支,我可以簡單地忘記它們存在,但在這種情況發生之前,我需要將它們保留在本地。

+1

你的任務看起來類似於這個http://hgbook.red-bean.com/read/advanced-using-of-mercurial-queues.html。通過由「Mercurial Queues」管理的補丁堆棧解決。不知道是否有這樣的工具git – Alsk 2010-07-15 11:05:49

+0

@Alsk這確實看起來很相似。謝謝你的提示。 – 2010-07-15 20:50:08

回答

28

git svn documentation與Subversion分支打交道時,建議採用以下流程:

# Clone a repo (like git clone): 
git svn clone http://svn.example.com/project -T trunk -b branches -t tags 

# Append svn:ignore settings to the default git exclude file: 
git svn show-ignore >> .git/info/exclude 

# View all branches and tags you have cloned: 
git branch -r 

# Create a new branch in SVN 
git svn branch waldo 

# Reset your master to waldo: 
git reset --hard remotes/waldo 

# local changes 
git add ... 
git commit ... 

# pull changes on current branch 
git svn rebase 

# send changes to Subversion 
git svn dcommit 

# check for new branches 
git svn fetch

上面的工作流程是在一個單一的Subversion分支,你有一個提交位的豪華不間斷的變化,但雜耍多活躍的Subversion和git分支有點棘手。

要跟蹤Subversion版本庫的金都分公司,

git checkout -b waldo-svn remotes/waldo

的-svn後綴開始是爲了避免形式的警告

warning: refname 'waldo' is ambiguous.

,也提醒大家,這個混帳分支用於跟蹤Subversion分支。始終保持對這些分支線性的更改!

要更新瓦爾多 - SVN,運行

git svn rebase

這將獲取從Subversion的變化,底墊在這些之上的修改。它也足夠聰明,可以識別當你的本地更改被逐字上游接受時:它將被Subversion提交替代,並在其提交消息中有一行以git-svn-id: ...開頭。

當上遊維護者改變的內容和你的補丁的結構(例如,修改代碼,分割補丁成多個的Subversion提交,或多個補丁組合成單個提交)是當生活變得有趣解決衝突和試圖解開混亂。

爲了保持一般性,請將您的-svn分支保存在git中(不要更改),並創建問題分支以關閉-svn分支。要發送一個補丁,使用

git diff waldo-svn waldo-fix-frobnicator

然後,當你git svn rebase趕上顛覆回購,你需要查看日誌和混帳決定您的問題分支各自的性格,排序的GTD

+3

+1「讓你的樹枝幹淨」。它們本質上不是*你的* svn分支,它們是上游分支,因此它們必須作爲單獨的分支堅持在本地Git存儲庫中。如果這樣,你可以像Git上游分支一樣使用它們。 – 2010-07-11 06:28:40

+1

Thx這樣長的回答gbacon。但那不是我遇到的問題。我已經重新提出了這個問題,希望現在會更清楚。 – 2010-07-11 08:37:34

+2

'-T trunk -b branches -t tags'的簡單同義詞是'-s'。 – l0b0 2012-04-16 10:54:57

1

我不太確定我是否瞭解您的問題,但我認爲您可能正在尋找git stash

+0

感謝這會有所幫助,但它不是解決整個問題的方法。 – 2010-06-29 13:50:02

1

我不確定您的功能與上游代碼的耦合程度有多高,但您可能會將上游的「核心」與您的功能添加區分開來。這隻有在你能夠對代碼庫進行分區時纔有效。

+0

那麼,我做的代碼分區。我將代碼的一部分保持與基本完全脫節,因爲針對此代碼的補丁數量使得上游錯誤修正無關緊要。 問題是代碼的其餘部分。 – 2010-06-29 13:51:12

0

你真的沒有說清楚你想做什麼。關於你的陳述,「(爲每個特徵維護單獨的分支因此是非平凡的)」,我只能想知道爲什麼你認爲它應該是微不足道的。兩個互相依賴的補丁應該是單個補丁,或者至少在一個分支上。依賴於A的修補程序B(但不是另一種方式)應該在具有A的分支上,或者在具有A分支上的父承諾的分支上。

現在,如果你想保持你的補丁上游位置的「清晰概覽」,這將歸結爲保留所有上游分支的本地副本。我沒有看到問題出在哪裏。如果你想得到更準確的答案,你確實需要精確。


好的,現在更容易處理。

你有兩個問題。 (1)得到的fork提交永遠不會從你的主開發分支上游轉移到fork分支,一旦你意識到你永遠不會發送它們。

做一個分支。一旦你意識到一個功能不會回來,從保持叉功能的分支拉。然後git revert叉功能應用修補程序,從local- *撤消功能。根據需要重複。

(2)你是在擔心上游補丁發生了什麼。

你真的不應該追蹤他們是否已經將你的補丁應用於遠程穩定(從此以後穩定的)。如果您從r-stable拉出並且尚未應用該補丁,則不會丟失L穩定中的補丁。唯一可能的問題是補丁中的代碼會產生合併衝突,但是你無法解決這個問題。一旦他們應用了這個補丁,它將看起來與你解決合併衝突的方式完全相同(在這種情況下,當你從R-stable中抽取補丁時,你將得不到這個補丁),否則他們會以不同的方式合併,你會得到合併衝突,並有機會決定保持自己的方式或你的方式。只要記住,如果你想保持自己的方式,你會從r穩定分叉。一種選擇是將您的方式轉移到叉子上,並保留在本地*上。

+0

我再次重新提出了這個問題。希望現在會清楚。 – 2010-07-11 08:35:46