簡體   English   中英

如何將變更集從hg存儲庫導出到svn存儲庫

[英]How do I export changesets from hg repository to svn repository

我知道mercurial有hgsubversion擴展名。 但在我知道它是如何工作之前,我維護了兩個獨立的存儲庫,一個是SVN repo,一個是Hg repo。 我最近在Hg存儲庫中進行了大部分更改,我需要將它們“推送”到svn存儲庫。

最直接的方法是從svn獲得一個與hg中的一個修訂版同步的修訂版。

從那里,我更新到下一個版本(從Hg),然后提交它(到svn)。 對許多變更集重復這些步驟是相當不方便的。 有更方便的方法嗎?

如果可能,可以在Windows操作系統中使用的解決方案。

問候,

Afriza

如果你在談論線性系列的變更集(沒有合並),你可以使用shell for循環

for therev in $(seq $(hg id -n -r .) $(hg id -n -r tip)) ; do
  hg update $therev
  svn commit -m "$(hg log --template '{desc}' -r .)"
done

它從簽出修訂版循環到提示,並依次提交每個提交保留提交消息。 你可能需要做一些花哨的arround添加/刪除文件。

不是,沒有。

您可能已經看過這個鏈接。 目前尚未正式支持與svn repos交互。 我不會寫一個shell腳本來自動執行此操作。 這可能會產生意想不到的結果搞砸了回購(但請看下面的工作流程)

https://www.mercurial-scm.org/wiki/WorkingWithSubversion

我目前做的事與你的做法類似。

  1. 從svn repos結賬保存在$ HOME / svnhgrepos / project1下
  2. 轉到$ HOME / svnhgrepos / project1,hg init,hg commit
  3. 更改$ HOME / svnhgrepos / project1 / .hg / hgrc以在推送時自動更新
  4. 將$ HOME / svnhgrepos / project1克隆到$ HOME / code / project1-clone。
  5. 轉到$ HOME / code / project1-clone,hg qinit(mercurial queues)
  6. 做所有的開發,提交它(每個功能/ bugfix只需一個變更集)並將其推送到$ HOME / svnhgrepos / project1
  7. 轉到$ HOME / svnhgrepos / project1,然后執行'svn ci'
  8. 我沒有在我的設置中執行此步驟。 現在你可以寫一個hg鈎子,自動執行'hg update'和'svn commit'
    \neg (i have not tested this) in $HOME/svnhgrepos/project1/.hg/hgrc [hooks] changegroup.hg-update = hg update >&2 changegroup.svn-commit = svn commit -m "hg log --template '{desc}' -r ."   \neg (i have not tested this) in $HOME/svnhgrepos/project1/.hg/hgrc [hooks] changegroup.hg-update = hg update >&2 changegroup.svn-commit = svn commit -m "hg log --template '{desc}' -r ." 

我接受了Ry4an的回答並添加了添加/刪除處理。 這里是:

for therev in $(seq $(hg id -n -r .) $(hg id -n -r tip)) ; do
  hg update -C $therev
  svn st | perl -lne 'if (/^([?!])\s*(\S*)/) { my $command = ($1 eq "?") ? "add" : "rm"; my $fname=$2; $fname =~ s[\\][\/]g; system(qq(svn $command $fname));}'
  svn commit -m "$(hg log --template '{desc}' -r .)"
done

我發現在涉及分支時需要-C。 但是,這非常難看,因為文件在分支之間切換時會被刪除並重新添加。 通常,重命名信息也會丟失,當然還有原始提交者的日期和身份。

看起來你可以使用hg convert來追溯你想要的東西。 啟用ConvertExtension,然后執行hg convert -d svn file/path/to/mercurial/repo svn://repo/path/雖然我沒試過。

這可能不是你想要的,但我想你可能會在某些時候發現它的使用。 而且,其他人也可能......

我在Windows 7操作系統上工作,我使用Mercurial(TortoiseHg)和Subversion(TortoiseSVN)進行源代碼控制。 為什么? 好吧,我們在約8人的小團隊中發現,Mercurial非常方便用作“個人”安全網,但對我們的一些人來說非常困惑(例如,工作的FPGA工程師Verilog的)。 整個“推動”和“拉動”認為需要將一大堆其他人的變化合並到你的中並不是張開雙臂歡迎的。 這看起來很麻煩,在一個案例中,由於誤解了Mercurial如何做這些事情的一些細微差別,工程師失去了所有的工作。 幸運的是,另一個副本(她是一個聰明的工程師!)所以一切都沒有丟失,但它證明了Mercurial的操作如何令人困惑和難以預測,至少對某些人來說如此。

Mercurial的優勢(IMO)是您可以輕松地在各種開發分支之間切換,並使用TortoiseHg工具,可視化版本樹並選擇您想要處理的內容。 您可以非常輕松(並且快速!)保存您的工作,抓住另一個分支或開始新的分支,進行一些實驗或尋求替代方法。 作為一個方便的個人安全網和分支切換工作台工具,它是一流的。 我一直在使用它,因為我正在開發和測試我的代碼。

另一方面,Subversion是一個非常容易使用的“團隊”服務器。 人們發現它很容易理解它是如何工作的。 標記和分支不是那么直觀,但我們不經常這樣做。 更新,合並和簽入似乎更直觀,更易於管理。

事實證明,你可以同時使用BOTH Mercurial和Subversion管理一個工作副本! 你可以從SVN結帳,然后使用Mercurial“在這里創建存儲庫”,或者反過來做。 您必須編輯SVN的忽略設置以忽略工作副本文件夾中的所有.hgxxxx文件,並讓Mercurial忽略.svn目錄。 完成后,任一系統的命令行或shell擴展工具都會繼續正常工作,您現在可以在兩個不同的存儲庫中管理代碼!

起初我對此持懷疑態度,但我真的想要日常Mercurial的便利性,以及Subversion的中央服務器合規性,這是我們的團隊為共享代碼庫選擇的。 這種工作方式為您提供了兩個世界中最好的,沒有任何缺點我到目前為止已經注意到了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM