svn - Mercurial到Mercurial到顛覆工作流問題




hgsubversion (4)

我們現在使用移植命令做類似的事情。 有效地,我們在推送之前重新創建每個變更集,以避免必須推送合併變更集。

我們的目標是為使用顛覆的項目做出乾淨的貢獻。

  • 為您的所有更改創建一個subversion分支。 在Mercurial中獲取它。
    $ cd [svn-checkout] ; svn cp trunk branches/hg-bridge cd [svn-checkout] ; svn cp trunk branches/hg-bridge
    $ cd [hgsubversion bridge] ; hg pull ; hg update hg-bridge cd [hgsubversion bridge] ; hg pull ; hg update hg-bridge

  • 檢查您當地的倉庫是否有新的變化
    hg in [repo] # shows <rev> IDs you can use later $ hg in [repo] # shows <rev> IDs you can use later

  • 從本地倉庫中拉出您想要進入svn的更改
    $ hg pull [repo]

  • 嫁接您想要貢獻的所有更改:
    $ hg graft [rev] [rev] # rev could be 645 or b7a92bbb0e0b. Best use the second>. hg graft [rev] [rev] # rev could be 645 or b7a92bbb0e0b. Best use the second>.
    您需要單獨指定每個轉速,
    但是你可以在一個命令中移植多個轉速。

  • 檢查你會推動什麼:
    $ hg outgoing

  • 推動更改:
    $ hg push
    可能會顯示一些不相關的拉動修訂版
    並且應該顯示您的新版本,
    以及備份包的路徑(您不應該使用)。(註釋也可以在GPLv2或更高版本下使用)

我們正在從Subversion遷移到Mercurial。 為了促進遷移,我們正在創建一個中間Mercurial存儲庫,它是我們的Subversion存儲庫的一個副本。 所有開發人員將開始切換到Mercurial存儲庫,我們將定期將更改從中間Mercurial存儲庫推送到現有的Subversion存儲庫。 經過一段時間後,我們將簡單地廢棄Subversion存儲庫,中間的Mercurial存儲庫將成為新的記錄系統。

Dev 1 Local --+--> Mercurial --+--> Subversion
Dev 2 Local --+                +
Dev 3 Local --+                +
Dev 4 -------------------------+

我一直在測試它,但是當我將更改從我的本地存儲庫推送到中間Mercurial存儲庫,然後直到我們的Subversion存儲庫時,我一直遇到問題。

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/01.png

在我的本地計算機上,我有一個已提交的變更集,可以將其推送到我們的中間Mercurial存儲庫。 在這裡你可以看到它是版本#2263,哈希625 ...

替代文字http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/02.png

我只將此變更集推送到遠程存儲庫。

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/03.png

到目前為止,一切都很好看。 變更集已被推送。

hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

我現在切換到遠程存儲庫,並更新工作目錄。

hg push
pushing to svn://...
searching for changes
[r3834] bmurphy: database namespace
pulled 1 revisions
saving bundle to /srv/hg/repository/.hg/strip-backup/62539f8df3b2-temp
adding branch
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
rebase completed

接下來,我將更改推送到Subversion,效果很好。 此時,更改位於Subversion存儲庫中,我將注意力返回給我的本地客戶端。

替代文字http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/04.png

我將更改提取到本地計算機。 咦? 我現在有兩個變更集。 我的原始變更集現在顯示為本地分支。

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/05.png

另一個變更集有一個新的修訂號2264和一個新的哈希10c1 ......

替代文字http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/06.png

無論如何,我將本地倉庫更新為新版本。

替代文字http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/07.png

我現在換了。

替代文字http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/08.png

所以,我最後點擊“確定並標記外發更改集”,正如您所看到的,Mercurial仍然想要推出我以前的更改集,即使它們已被推送。

顯然,我做錯了什麼。

我也無法合併這兩個版本。 如果我在本地計算機上合併兩個修訂版,我最終會進行“合併”提交。 當我將合併提交推送到中間Mercurial存儲庫時,我不能再將更改推送到我們的Subversion存儲庫。 我最終遇到以下問題:

hg update
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

hg push
pushing to svn://...
searching for changes
abort: Sorry, can't find svn parent of a merge revision.

我必須回滾合併才能回到工作狀態。

我錯過了什麼?


首先,讓我說一下閱讀如此詳細的問題是多麼高興。 :)

當您從遠程執行hg push到svn repo時會發生此問題。 這是您的示例的輸出:

hg push
pushing to svn://...
searching for changes
[r3834] bmurphy: database namespace
pulled 1 revisions
saving bundle to /srv/hg/repository/.hg/strip-backup/62539f8df3b2-temp
adding branch
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
rebase completed

我不是一個hg-subversion用戶,但是輸出結果表示在執行你所請求的推送的過程中,它正在從svn repo中提取更改,找到一個新的修訂版,然後在(後代)之後對變更集10c1進行變更。新推出的修訂版。 rebase命令採用分支歷史並將其轉換為線性歷史,但這樣做會改變變更集的父級,這會改變它們的哈希值,這看起來就像發生在你身上的事情。

同樣,不是一個hg-subversion用戶,所以我不能說是否總是應該發生pull / rebase以及它應該如何工作,但是hgsubversion wiki頁面說:

您可以使用常用的Mercurial命令來使用此存儲庫。 如果您在給定分支上有一系列提交,並希望將它們移動到該分支的頂端,請在工作提示時使用hg rebase --svn命令,並且這些更改集將自動在新的上游工作。

這聽起來通常不是自動的。

我不能從你的介紹中說出,是否仍然在svn中創建了新的變更集,或者它們是僅在mercurial中創建的?

如果它們只是在mercurial中創建,那麼一個解決方法是在遠程系統上設置一個svn-gateway repo,並從那裡進行推送,並且永遠不會從該repo中恢復到mercurial。 然後,由於rebase,該repo中的更改集將具有不同的哈希值,但它們不會流回主遠程倉庫和最終用戶系統。

更大的修復方法是找出為什麼“hg push svn:// ..正在重新定義所有出站變更集”。 回答一個,行為將停止。


你沒有做錯任何事情,事實上在你的情況下,你所看到的行為是預期的(如果對新的Mercurial用戶有些混淆)結果。

hgsubversion非常適合兩件事:

  1. 使用Mercurial作為Subversion的客戶端,而不在svn之外交換更改
  2. 將Subversion存儲庫轉換為Mercurial

您正在嘗試將其用作更通用的網關,這是一個更難解決的問題。 Subversion對世界有著非常嚴格的看法,我們必須在其中開展工作。 問題的真相是,在從Subversion中提取修訂版後使用hgsubversion時,修訂版哈希只能被視為最終版本。 因此,如果您的開發人員直接在Mercurial存儲庫之間共享更改集,而不將Subversion作為中介,則會發生這種情況。

rebase是自動的,非選擇性的,這是一個非常根本的原因:Subversion在你推送時執行rebase。 如果您在推送時進行了無法更改,Subversion會為您執行該rebase,如果成功(使用非常簡單的重新定位算法),它會接受提交,但不會指示發生了rebase。 我們正在修補兩個不同的模型。

我建議立刻將所有人轉移到Mercurial上 - 像這樣的混合方法只會使Mercurial在短期內變得更加困難,並且可能會使新用戶混淆DVCS。


如果你使用svn:externals屬性,你可以省去配置和使用SVN的一些痛苦,如Nick的文章所述。 這將使您的本地版本的Drupal自動與指定的Drupal分支保持同步,並且您可以為模塊使用完全相同的機制。 另外,因為SVN將從文件中讀取外部定義,所以您也可以將它們置於版本控制之下!

我不認為CVS具有同等的功能。 但是,編寫一個簡單的腳本可以很容易地自動安裝Drupal模塊,只需要一個URL(我這樣做是為了讓我自己的Drupal站點保持最新)。

就數據庫的版本控製而言,這是一個要解決的棘手問題。 我建議將“stock”Drupal數據庫導出到SQL文件並將其置於版本控制之下。 每個開發人員都有自己的本地私有數據庫服務器。 然後,您可以提供一個腳本,將指定的數據庫還原為SQL文件中包含的庫存版本。

作為如何以其他方式解決這個問題的一個例子,我將描述工作中的情況。 我在Web應用程序上工作; 它不使用數據庫,所以不會遇到這些問題。 我們繞過重複設置站點的方法是從源代碼控制重建並提供程序來實現站點的自動部署。 該程序也被我們的客戶用作創建網站的方式。





svn mercurial hgsubversion