2012-02-05 128 views
3

我一直在使用Git,並且想將通常的工作流轉換爲Mercurial。特別是,我有興趣轉換我將用於貢獻Git項目的工作流程,以便能夠爲Mercurial項目做出貢獻。將Git工作流轉換爲Mercurial

通常情況下,在GitHub上的一個項目,我會從原來的項目叉子GibHub的項目,然後取這兩個地方,有兩個不同的遠程名稱:

# Clone the initial repository and call the remote repository 'github-origin' 
git clone -o github-origin git://github.com/orig_author/project.git 

# Add the forked GitHub repo as an additional remote repo ('github-mine') 
cd project 
git remote add github-mine git://github.com/me/project.git 
git fetch github-mine 

當我列出了分支機構與git branch -a ,我得到的是這樣的:

* master 
    remotes/github-mine/some_feature 
    remotes/github-mine/master 
    remotes/github-origin/HEAD -> github-origin/master 
    remotes/github-origin/some_feature 
    remotes/github-origin/master 

我可以使用git checkout -b new_feature創建自己的地方分支,然後將其推回給我的GitHub存儲庫,從而增加了兩個引用:

* my_feature 
    remotes/github-mine/my_feature 

然後,我可以聯繫原作者討論此功能,提交拉請求等。 所有這個工作流程實際上完全獨立於原作者的工作時間線。這使得討論實驗性功能非常容易,而不會影響主項目的存儲庫。

如果原作者提交了更多更改,我可以跟上git fetch github-orig並可能合併或重新綁定我的本地更改。作爲一個快速測試(由當前分支假設是my_feature):

git fetch github-origin 
git checkout -b temp 
git rebase github-origin/master 

這個工作流程的一個根本問題是要能夠知道每個庫的分支位於相比,我自己的分支機構。特別是,重要的是要知道我的分支與具有相同名稱的遠程分支不同(甚至在兩個GitHub存儲庫之間,兩個master分支不需要是相同的)。使用gitk --all來看待這一切非常簡單。

我不知道如何在Mercurial項目上做同樣的事情(例如在BitBucket上)。

這是我一直試圖做的,在此基礎上Command Equivalence Table

hg clone https://bitbucket.org/orig_author/project 

# Edit .hg/hgrc and add 'bb-mine=https://bitbucket.org/.../project' to [paths] 

# Apparently equivalent to git fetch. 
hg pull bb-mine 

這似乎是工作,並將其拉的遠程提交(其實,我已經試過這一個儲存庫,我已經推了一個分支)。我可以看到所有使用hg branches的分支,但沒有跡象表明它們來自哪裏。 hg view沒有顯示任何東西。更重要的是,我的tip現在是我提交的最新版本,但我沒有相當於我將擁有的github-origin/master標籤(無論是在我自己的提交之前,還是在其他作者進行了更多更改之後)。

我希望能夠在將來的任何時候執行hg pull(相當於git fetch),以查看本地副本與其他作者所做的新更改之間的差異必然會改變我的本地存儲庫或BitBucket存儲庫中的任何內容(至少在我修復了由於這些更改而導致的潛在衝突之前)。當我使用Git(這是一個SSH服務器,我可以推送所有分支,甚至還沒有發佈的工作正在進行中)時,我也傾向於擁有自己的backup存儲庫。

我意識到Mercurial的分支方式與Git的方式不太一樣。但是,Mercurial有沒有相應的工作流程,還是隻能改變我的方法?我怎樣才能看到我使用的每個存儲庫在哪裏與他們各自的分支(他們可能有一些共同點)達成一致?

+0

任何你需要使用汞的理由? – 2012-02-05 18:54:32

+0

@AdamDymitruk我想分叉的項目是使用Hg。我研究過使用hg-git bridge,但是這似乎會使工作流程變得更加複雜,特別是如果我必須在BitBucket之類的項目上使用我自己的Hg分支來處理pull請求。 – Bruno 2012-02-05 19:15:48

回答

6

這是一個很大的問題,所以我要挑選幾個要點。我想你應該來IRC channelmailinglist尋求更多建議 - 我預測你的(進一步的)問題將是一種討論類型的性質,在那裏討論事情會更好。

[...]更重要的是,我現在tip是最近我提交的,但我沒有GitHub的原產地/主標籤的等效,我將不得不(無論它在我自己的提交或之後,如果其他作者進行了更多更改)。

不要太在意tip標籤。這是一個不推薦的概念,當你有多個分支時意味着越來越少。主要問題在於它只是存儲庫中最近的變更集,所以當您拉動時,它將從(命名)分支跳轉到(命名)分支。我們更願意談論default而不是其他命名的分支/書籤,因爲這些標識符以更受控制的方式移動。

我怎樣才能看到我使用的每個存儲庫在哪裏與他們各自的分支(他們可能有一些共同點)?

remotebranches extension可能會幫助您在此處獲得更類似Git的工作流程。

但是一般來說,如果你想在Mercurial中使用類似Git的分支,你應該看看bookmarks。您用hg branch創建的named branches與您使用git branch(Git缺少Mercurial的命名分支概念)所創建的分支幾乎沒有相似之處。

使用hg incominghg outgoing查看存儲庫之間的差異。這就是我通常會看到需要從其他克隆中提取或推送到哪個克隆的方式。