การแปลงโฟลเดอร์ Mercurial เป็นที่เก็บ Git


138

ฉันไม่มีประสบการณ์มากมายกับ Mercurial ส่วนใหญ่ฉันเป็นคน Git

ฉันชอบที่จะจำลองโฟลเดอร์ / ไฟล์ Mercurial เฉพาะใน git Repository สิ่งที่ฉันกำลังพยายามทำคือการส่งออกประวัติของไฟล์จากที่เก็บ Mercurial ไปยัง Git และสามารถซิงค์สิ่งนี้กับการกระทำในอนาคตได้

คุณมีข้อเสนอแนะเกี่ยวกับวิธีดำเนินการหรือไม่? ฉันเชื่อว่าวิธีที่จะไปคือการได้รับประวัติของแพทช์ Mercurial ส่งออกทุกการกระทำเป็นแพตช์เป็นระยะ ๆ และใช้แพทช์ Mercurial กับที่เก็บ Git


ปัจจุบัน GitHub.com จะนำเข้าสำหรับคุณ
Brad Turek

ที่เกี่ยวข้อง: คำแนะนำดีๆใน git-scm.com: git-scm.com/book/en/v2/…
maxschlepzig

คำตอบ:


124

บนLinuxหรืออะไรก็ได้ที่มีbash/shหรือคล้ายกันหรือpythonลองส่งออกอย่างรวดเร็ว :

cd
git clone git://repo.or.cz/fast-export.git
git init git_repo
cd git_repo
~/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo
git checkout HEAD

1
โอเคคุณต้องการซิงโครไนซ์คอมไพล์กับ Mercurial ต่อไปไหม แบบนี้เหรอ?
Yohann

1
โปรดทราบว่า '/ path / to / old / mercurial_repo' ต้องเป็นพา ธ บนระบบไฟล์ (ไม่ใช่ URL) ดังนั้นคุณต้องโคลนที่เก็บดั้งเดิมก่อน
มี.ค.

1
ในกรณีของฉันต้องใช้PYTHON=python2 ~/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo. นอกจากนั้นยังทำงานได้อย่างไม่มีที่ติ
Artur Czajka

5
ขอบคุณสำหรับคำตอบที่กระชับ! ฉันต้องsudo easy_install mercurialก่อน จะดีที่จะมีในคำแนะนำ
Marcus Westin

3
หากคุณใช้เครื่อง Windows ให้ใช้ Git bashและเรียกใช้hg-fast-export.sh
Augustas

62

Windows: ส่วนขยาย TortoiseHG Hg-Git

Hg-Gitสามารถใช้เพื่อแปลงที่เก็บ Mercurial เป็น Git คุณสามารถใช้ที่เก็บในเครื่องหรือที่เก็บระยะไกลที่เข้าถึงผ่าน SSH, HTTP หรือ HTTPS

ตัวอย่างการแปลงที่เก็บในเครื่อง

  1. ติดตั้ง Hg-Git

    • บน Windows TortoiseHgมาพร้อมกับ Hg-Git แม้ว่าคุณจะต้องเปิดใช้งานผ่านเครื่องมือการตั้งค่า (ในส่วนขยาย)

      การตั้งค่า TortoiseHg

      หรือด้วยตนเองใน ~/mercurial.ini

      [extensions]
      hggit =
      
  2. ใช้คำสั่งต่อไปนี้เพื่อแปลงที่เก็บ:

    $ mkdir git-repo; cd git-repo; git init; cd ..
    $ cd hg-repo
    $ hg bookmarks hg
    $ hg push ../git-repo
    

hgบุ๊กเป็นสิ่งที่จำเป็นเพื่อป้องกันไม่ให้ปัญหาเป็นอย่างอื่นดัน HG-คอมไพล์ไปตรวจสอบในขณะนี้ออกมาทำให้เกิดความสับสนสาขา Git สิ่งนี้จะสร้างสาขาที่มีชื่อhgในที่เก็บ Git หากต้องการรับการเปลี่ยนแปลงในต้นแบบให้ใช้คำสั่งต่อไปนี้ (จำเป็นเฉพาะในการรันครั้งแรกใช้ในภายหลังgit mergeหรือrebase):

$ cd git-repo
$ git checkout -b master hg

ฉันพบว่า git-hg ค่อนข้างบั๊ก แต่มันใช้งานได้ดีและไม่ต้องการการดาวน์โหลดเพิ่มเติมใด ๆ ซึ่งเป็นสิ่งที่ดี
Timmmm

2
ฉันต้องการโฟลเดอร์ไม่ใช่ repo ทั้งหมด
Simone Carletti

ตอนนี้ github มีเครื่องมือที่รองรับสิ่งนี้โดยตรงจาก github ดูstackoverflow.com/questions/16037787/…
Tommy

@SimoneCarletti ลองดูคำถามนี้ ควรช่วยคุณในการส่งออกไฟล์ / โฟลเดอร์และประวัติของไฟล์ในที่เก็บชั่วคราว จากนั้นคุณสามารถใช้โซลูชันที่ให้มาเพื่อแปลงที่เก็บ Mercurial ชั่วคราวเป็น Git
naXa

13

คุณสามารถ (จากด้าน Mercurial):

  • ใช้แปลงนามสกุลพร้อม--filemapตัวเลือกแปลงส่วนของ repo ดั้งเดิมให้เล็กลงด้วยไฟล์ที่จำเป็นเท่านั้น | ไดเร็กทอรี
  • ด้วยส่วนขยาย hg-git ผลัก repo ไปยัง Git

หรือ (แทน hg-git) โดยใช้Mercurial bridge ใน Git , clone | ดึงที่เก็บจาก Git


11

Gitify

ดูเหมือนจะเป็นทางเลือกที่ทันสมัยและใช้งานง่ายกว่าในการแปลง https://github.com/buchuki/gitifyhg

pip install gitifyhg
git clone gitifyhg::<hgrepoaddress>
# done, you have a git repo with the entire history of the hg one

1
ฉันไม่ต้องการแปลง repo ทั้งหมดเพียงแค่โฟลเดอร์
Simone Carletti

1
สุดยอด! ระวังข้อผิดพลาด Unicode แม้ว่าgithub.com/buchuki/gitifyhg/pull/98
Andrei

3
หมายเหตุ - ปัจจุบัน gitifyhg ล้าสมัยอย่างมากกับ Mercurial เวอร์ชันล่าสุด
Zoran Pavlovic

6

แปลงที่เก็บ Mercurial เป็น Git บน Windows 10

หากไม่มีปัญหากับการเข้ารหัส - ใช้ส่วนขยาย TortoiseHG Hg-Git

md new-repo && cd new-repo
git init --bare .git
cd ..\old-mercurial-repo
hg bookmark -r default master
hg push ..\new-repo
cd ..\new-repo
git config --bool core.bare false

หากมีสิ่งผิดปกติกับการเข้ารหัสให้ใช้การส่งออกอย่างรวดเร็ว

ติดตั้ง Bash

เปิด PowerShell ในฐานะผู้ดูแลระบบและเรียกใช้:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

ติดตั้ง Ubuntu 16.04 LTS จากMicrosoft Store

เปิด Bash และเรียกใช้

ติดตั้ง Mercurial

sudo -s
apt-get update
apt install mercurial

รับ v180317 ที่ส่งออกอย่างรวดเร็ว (ในขณะนี้เวอร์ชันหลังจาก 180317 ทำงานไม่ถูกต้อง)

cd /mnt/c/path_to_work_folder
git clone https://github.com/frej/fast-export.git
cd fast-export
git checkout tags/v180317
cd ..

แปลงที่เก็บ

git init new-repo && cd new-repo
git config core.ignoreCase false && git config core.quotepath off
../fast-export/hg-fast-export.sh -r ../path_to_mercurial_repo/ --fe cp1251
git checkout master

ตัวเลือกการเข้ารหัส:

  • -f การเข้ารหัสเช่น -f cp1251
  • --fe การเข้ารหัสชื่อไฟล์เช่น --fe cp1251

3

hg-git- นำเข้าอย่างรวดเร็ว

https://github.com/kilork/hg-git-fast-import

ยูทิลิตี้อื่นที่มีคุณสมบัติดังต่อไปนี้:

  1. นำเข้าที่เก็บ Mercurial เดียวและหลายรายการไปยังที่เก็บ Git
  2. นำเข้าการแก้ไขใหม่จากที่เก็บ Mercurial ที่นำเข้าก่อนหน้านี้ไปยังที่เก็บ Git
  3. แท็ก
  4. ปิดสาขา.
  5. การตรวจสอบผลลัพธ์สุดท้ายด้วยความแตกต่าง

คุณสามารถดาวน์โหลดไบนารีสำหรับคุณแพลตฟอร์มและใส่ที่ไหนสักแห่งในเส้นทางหรือการติดตั้งcargo(จำเป็นต้องใช้rustจะได้รับการติดตั้ง ):

cargo install hg-git-fast-import

จากนั้นการใช้งานจะเป็นดังนี้:

hg-git-fast-import single /path/to/source_hg /path/to/target_git

ไม่จำเป็นPythonและMercurialต้องติดตั้ง การกำหนดค่าขั้นสูงช่วยให้สามารถแทนที่ผู้เขียนหรือสาขาสร้างสาขาที่นำหน้าและอื่น ๆ


2

หากคุณใช้github.comดูเหมือนว่าจะมีคุณลักษณะการนำเข้าที่ให้คุณพิมพ์ URL ของโปรเจ็กต์ hg ของคุณ

แรกสร้างพื้นที่เก็บข้อมูลใหม่และจากนั้นในการเลื่อนหน้า Landing Page ที่เก็บใหม่ไปที่ด้านล่างและคลิกที่ปุ่ม "รหัสนำเข้า"

บริบทสำหรับปุ่มรหัสนำเข้า

จากนั้นพิมพ์URL ของที่เก็บก่อนหน้าของคุณแล้วกด "เริ่มการนำเข้า"

บริบทสำหรับปุ่ม "เริ่มการนำเข้า"

จากนั้น GitHub จะดูแลส่วนที่เหลือ!

Github ดูแลธุรกิจให้คุณ

โปรดทราบว่า GitHub จะขอข้อมูลประจำตัวของคุณสำหรับที่เก็บเก่าหากต้องการ

โอ! ฉันพบคู่มืออย่างเป็นทางการ


0

บน Windows อาจเป็นเรื่องยุ่งยากเล็กน้อย หลังจากเปิดใช้งานปลั๊กอินที่ถูกต้องใน mercurial ( hggit) แล้วยังสามารถใช้ TortoiseHG ได้

  1. โคลน repo เมอร์คิวเรียล
  2. โคลน repo คอมไพล์
  3. Enable console: การเปิดใช้งานคอนโซล
  4. การใช้คอนโซล:

    % hg bookmarks hg

    % hg push <relative path to>/<git-repo>


0

บางทีมันอาจช่วยใครบางคนในวันนี้ (เมื่อแปลงที่เก็บ Mercurial เป็น git ในขณะที่รักษาประวัติไว้) ผ่านการทดสอบการทำงานร่วมกับ Mercurial 4.0.1

~$ git clone https://*old_hg_repo*
~$ git clone https://github.com/frej/fast-export.git
~$ cd fast-export
~$ git checkout tags/v180317
~$ cd ..
~$ mkdir new_git_repo
~$ cd new_git_repo
~$ git init
~$ .../fast-export/hg-fast-export.sh -r ../old_hg_repo/ --force
~$ git checkout HEAD

และสุดท้ายเพื่อผลักดัน repo ท้องถิ่นที่เพิ่งแปลงใหม่ของคุณ

~$ git push REMOTE '*:*'

คำตอบของคุณแตกต่างจากคำตอบที่โพสต์ก่อนหน้านี้อย่างไร
maxschlepzig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.