在BitBucket中把Mercurial/Hg倉庫轉換爲Git倉庫

當初選擇BitBucket的原因是,BitBucket免費支持私有庫。而且BitBucket同時支持Git和Mercurial。
當初選擇Mercurial的原因是,Mercurial看起來好像比Git要簡單些。
但是,今年的8月BitBucket宣佈明年不再支持Mercurial了。 好吧,那隻能想辦法把Mercurial的倉庫轉換爲Git的了。 本來想着BitBucket會提供把Mercurial庫轉換爲Git庫的功能,但是並沒有(又或許是我沒有找到),所以只能另想辦法了。
[注] 剛發現,在BitBucket上新建倉庫時,可以導入Mercurial庫,所以……

幸好有好心人提供了工具,叫hg-fast-export。 看起來還算簡單,下面實際操作一下。

環境

  • Debian 10 Buster
  • Python 2.7.16
  • 互聯網連接

準備工具

  • 安裝Git和Mercurial
sudo apt install git mercurial
  • 安裝Mercurial的Python庫
pip2 install mercurial -i https://mirrors.aliyun.com/pypi/simple/

準備本地Mercurial倉庫

  • 將BitBucket上的Mercurial庫(名稱170101)clone到本地。

注意:這裏我使用了一個假鏈接,實際操作需要換成真實的

z@wn:~$ mkdir ~/hg-src
z@wn:~$ cd ~/hg-src
z@wn:~/hg-src$ hg clone https://[email protected]/project1/170101

http authorization required for https://bitbucket.org/project1/170101
realm: Bitbucket.org HTTP
user: username
password:
destination directory: 170101
requesting all changes
adding changesets
adding manifests
adding file changes
added 23 changesets with 357 changes to 140 files
new changesets 124c:826b (21 drafts)
updating to branch default
140 files updated, 0 files merged, 0 files removed, 0 files unresolved
z@wn:~/hg-src$
  • 下載hg-fast-export工具
z@wn:~$ mkdir ~/git-src/
z@wn:~$ cd ~/git-src
z@wn:~/git-src$ git clone https://github.com/frej/fast-export.git
Cloning into 'fast-export'...
remote: Enumerating objects: 31, done.
remote: Counting objects: 100% (31/31), done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 1473 (delta 14), reused 26 (delta 9), pack-reused 1442
Receiving objects: 100% (1473/1473), 405.65 KiB | 71.00 KiB/s, done.
Resolving deltas: 100% (866/866), done.
z@wn:~/git-src$

轉換爲Git倉庫

  • 在BitBucket上新建一個空的Git的倉庫,取名170101-git
  • 在本地建立一個空的Git倉庫,圖方便,也取名170101-git
z@wn:~/git-src$ git init 170101-git
Initialized empty Git repository in /home/z/git-src/170101-git/.git/
z@wn:~/git-src$ cd 170101-git/
z@wn:~/git-src/170101-git$ ~/git-src/fast-export/hg-fast-export.sh -r ~/hg-src/170101
master: Exporting full revision 1/23 with 1/0/0 added/changed/removed files
master: Exporting simple delta revision 2/23 with 1/0/0 added/changed/removed files
master: Exporting simple delta revision 3/23 with 121/1/0 added/changed/removed files
master: Exporting simple delta revision 4/23 with 3/12/0 added/changed/removed files
master: Exporting simple delta revision 5/23 with 0/9/0 added/changed/removed files
master: Exporting simple delta revision 6/23 with 0/6/0 added/changed/removed files
master: Exporting simple delta revision 7/23 with 0/4/0 added/changed/removed files
master: Exporting simple delta revision 8/23 with 0/13/0 added/changed/removed files
master: Exporting simple delta revision 9/23 with 0/9/0 added/changed/removed files
master: Exporting simple delta revision 10/23 with 0/5/0 added/changed/removed files
master: Exporting simple delta revision 11/23 with 0/23/0 added/changed/removed files
master: Exporting simple delta revision 12/23 with 0/6/0 added/changed/removed files
master: Exporting simple delta revision 13/23 with 0/13/0 added/changed/removed files
master: Exporting simple delta revision 14/23 with 0/12/0 added/changed/removed files
master: Exporting simple delta revision 15/23 with 0/7/0 added/changed/removed files
master: Exporting simple delta revision 16/23 with 3/19/0 added/changed/removed files
master: Exporting simple delta revision 17/23 with 11/9/0 added/changed/removed files
master: Exporting simple delta revision 18/23 with 0/23/0 added/changed/removed files
master: Exporting simple delta revision 19/23 with 0/7/0 added/changed/removed files
master: Exporting simple delta revision 20/23 with 0/12/0 added/changed/removed files
master: Exporting simple delta revision 21/23 with 0/8/0 added/changed/removed files
master: Exporting simple delta revision 22/23 with 0/18/0 added/changed/removed files
master: Exporting simple delta revision 23/23 with 0/1/0 added/changed/removed files
Issued 23 commands
/usr/lib/git-core/git-fast-import statistics:
---------------------------------------------------------------------
Alloc'd objects:       5000
Total objects:          514 (        16 duplicates                  )
      blobs  :          341 (        16 duplicates        224 deltas of        339 attempts)
      trees  :          150 (         0 duplicates        121 deltas of        138 attempts)
      commits:           23 (         0 duplicates          0 deltas of          0 attempts)
      tags   :            0 (         0 duplicates          0 deltas of          0 attempts)
Total branches:           1 (         1 loads     )
      marks:           1024 (        23 unique    )
      atoms:            149
Memory total:          2344 KiB
       pools:          2110 KiB
     objects:           234 KiB
---------------------------------------------------------------------
pack_report: getpagesize()            =       4096
pack_report: core.packedGitWindowSize = 1073741824
pack_report: core.packedGitLimit      = 35184372088832
pack_report: pack_used_ctr            =          2
pack_report: pack_mmap_calls          =          1
pack_report: pack_open_windows        =          1 /          1
pack_report: pack_mapped              =    2083265 /    2083265
---------------------------------------------------------------------

z@wn:~/git-src/170101-git$
  • 因爲轉換工具不會自動checkout倉庫裏文件的最新版本,所以需要執行一下checkout
git checkout HEAD
  • 然後添加BitBucket的遠程倉庫,接着push一下。

注意:這裏我使用了一個假鏈接,實際操作需要換成真實的

z@wn:~/git-src/170101-git$ git remote add origin https://[email protected]/project1/170101-git.git
z@wn:~/git-src/170101-git$ git push -u origin master
Password for 'https://[email protected]':
Enumerating objects: 514, done.
Counting objects: 100% (514/514), done.
Delta compression using up to 4 threads
Compressing objects: 100% (168/168), done.
Writing objects: 100% (514/514), 1.99 MiB | 236.00 KiB/s, done.
Total 514 (delta 345), reused 514 (delta 345)
remote: Resolving deltas: 100% (345/345), done.
To https://bitbucket.org/project1/170101-git.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
z@wn:~/git-src/170101-git$
  • 好了,在BitBucket上檢查一下對應的Git倉庫,如果沒有問題,就是大功告成啦。

完成

其實本人對Git和Mercurial都一知半解,如果有所錯漏,盡請諒解。

可以看出,這個方法也可以將BitBucket上的Mercurial倉庫遷移到github上。

參考資料

http://ju.outofmemory.cn/entr...
http://hivelogic.com/articles...
http://www.voidcn.com/article...
https://www.yiibai.com/git/gi...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章