วิธีโยกย้าย / แปลงจาก SVN เป็น Mercurial (hg) บน windows


120

ฉันกำลังมองหาเครื่องมือในการย้ายที่เก็บ SVN สองสามแห่งไปยัง Mercurial พร้อมประวัติป้ายกำกับและอื่น ๆ

ฉันใช้ TortoiseHg (Windows x32) ดังนั้น ConvertExtensions จึงถูกยกเลิก มีข้อมูลบางอย่างเกี่ยวกับวิธีการทำกระบวนการนี้บนกล่อง Linux ( hgsvn ) แต่ฉันไม่มีเครื่อง Linux

ฉันสามารถใช้สคริปต์ Python บน Windows ได้หรือไม่ ถ้าเป็นเช่นนั้นฉันต้องทำอย่างไร? หรือฉันสามารถใช้เครื่องมืออื่นใดในการทำกระบวนการนี้ได้บ้าง

โดยทั่วไปฉันจะแปลงโครงการ SVN เป็น Mercurial ได้อย่างไร

คำตอบ:


93

ฉันต้องจัดการปัญหานี้ด้วยตัวเอง ฉันมีเครื่อง Windows XP กับหน้าต่างแยกกันเซิร์ฟเวอร์VisualSVN เซิร์ฟเวอร์

ฉันยังมีTortoiseHGติดตั้งเช่นเดียวกับCollabNet โค่นล้ม Command-Line ไคลเอ็นต์

<Enable Convert Extension w/ Tortoise Hg 2>

ขอบคุณมากสำหรับbgever ที่ชี้ให้เห็นในความคิดเห็นที่มี TortoiseHg 2.0 การเปิดใช้งานส่วนขยายการแปลงนั้นง่ายกว่าที่เคย ตามที่เขาบอก

ด้วย TortoiseHG 2.0 สิ่งนี้ทำให้ง่ายขึ้นมาก: เริ่ม TortoiseHG Workbench จากเมนูเริ่ม เลือกไฟล์ -> การตั้งค่า เลือกส่วนขยายจากรายการ เลือกช่องทำเครื่องหมาย "แปลง" แล้วคลิกตกลง แค่นั้นแหละ! ไม่ต้องพยายามสร้างไฟล์กำหนดค่าอีกต่อไปและค้นหาในระบบไฟล์ - bgever 11 มี.ค. เวลา 07:56 น

</Enable Convert Extension w/ Tortoise Hg 2>

<Enable Convert Extension Manually>

ในการแปลงที่เก็บจาก SVN เป็น HG ฉันทำตามขั้นตอนเหล่านี้:

1) เปิด C: \ Program Files \ TortoiseHg \ Mercurial.ini

แก้ไข

FYI - Tortoise Hg ได้ย้ายไฟล์นี้ไปที่ไฟล์

  • XP หรือเก่ากว่า - C: \ Documents and Settings \ USERNAME \ Mercurial.ini
  • Vista หรือใหม่กว่า - C: \ Users \ USERNAME \ Mercurial.ini

ไฟล์นั้นส่วนใหญ่จะว่างเปล่าและคุณจะแสดงรายการสิ่งที่คุณต้องการจะลบล้างในนั้น หากนั่นคือสิ่งที่คุณมีเพียงแค่เพิ่มสองบรรทัดนี้ที่ท้ายสุดของไฟล์:

[extensions]
convert =

2) ค้นหาบรรทัดที่ขึ้นต้นด้วย

[ส่วนขยาย]

3) ด้านล่างนี้คุณจะเห็นรายการคำหลักซึ่งแสดงความคิดเห็นด้วยเครื่องหมายอัฒภาค (;) ในแต่ละบรรทัด

4) ค้นหาบรรทัดที่ระบุว่า

; แปลง =

และลบอัฒภาคเพื่อให้อ่าน

แปลง =

</Enable Convert Extension Manually>

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

6) ใช้คำสั่งนี้

hg แปลงไฟล์: /// y: / yoursvnreponame

ฉันพบว่าเครื่องมือแปลงอาจมีปัญหากับที่เก็บในเครือข่ายดังนั้นฉันจึงต้องแมปไดรฟ์กับมัน แต่มันก็ใช้ได้ดีสำหรับฉัน


การเลือกคำตอบสำหรับคำถามนี้เป็นเรื่องยาก evilbloodydemon พูดถูกเมื่อเขาแสดงความคิดเห็นในคำตอบของเขาเพื่อแก้ไข config เพื่อเปิดใช้งานส่วนขยายการแปลง แต่คำตอบนี้ชัดเจนและแม่นยำยิ่งขึ้น
David Lay

1
ฉันแค่อยากจะพูดถึงว่าฉันทดสอบสิ่งนี้โดยไม่มีไคลเอนต์บรรทัดคำสั่ง SVN และมันก็ใช้ได้เช่นกัน คุณไม่จำเป็นต้องมีเซิร์ฟเวอร์ SVN ที่ทำงานเพื่อทำสิ่งนี้เพียงแค่เข้าถึงเส้นทางไฟล์ที่เก็บ
Michael La Voie

สิ่งนี้ใช้ได้ดีสำหรับฉันกับ Mercurial V1.4.3 ที่เก็บ svn อายุ 1 ปีแปลงอย่างรวดเร็วโดยที่ประวัติเต็มยังคงอยู่ ขอบคุณมาก!
Jonathan Webb

1
เพียงเพื่อเพิ่ม - ไฟล์ ini ไม่ได้ถูกสร้างขึ้นจากการติดตั้ง TortoiseHG เริ่มต้น คุณต้องใช้ / บันทึกการตั้งค่าบางอย่างก่อนหรือเริ่มต้นด้วยไฟล์เปล่าถ้าคุณรู้ว่าคุณกำลังทำอะไรอยู่
Ahmad

9
ด้วย TortoiseHG 2.0 สิ่งนี้ทำให้ง่ายขึ้นมาก: เริ่ม TortoiseHG Workbench จากเมนู Start เลือกไฟล์ -> การตั้งค่า เลือกส่วนขยายจากรายการ เลือกช่องทำเครื่องหมาย "แปลง" แล้วคลิกตกลง แค่นั้นแหละ! ไม่ต้องพยายามสร้างไฟล์กำหนดค่าอีกต่อไปและค้นหาในระบบไฟล์
Bart Verkoeijen

8
  1. เริ่มต้นเซิร์ฟเวอร์ svn บน localhost
  2. hg แปลง svn: // localhost / your_repo
  3. เสร็จสิ้นเนื่องจากการผูก svn จำเป็นสำหรับ file: // protocol เท่านั้น

Nopes ทั้งไบนารีปรอทสำหรับ win32 หรือ TortoiseHg มาพร้อมกับส่วนขยายการแปลงดังนั้น "hg convert" จึงไม่ใช่คำสั่งที่ถูกต้องใน win32
David Lay

1
ฉันลองใช้ svn: // แทน file: // แต่มันยังคงขอการผูก Python
fglez

การใช้ svn: // แทน file: // ใช้ได้ผลกับฉันโดยไม่ต้องผูก Python ในการเริ่มต้นเซิร์ฟเวอร์ svn คำสั่งคือ: svnserve -r <path to repo root> -d
Petter Wigle

7

Mercurial มีbuilt-in ส่วนขยายสำหรับการแปลงนี้


2
ฉันรู้ว่านี่เป็นสิ่งแรกที่ฉันสะดุด แต่อ้างว่า: "โปรดทราบว่าคุณไม่สามารถทำได้ด้วยไบนารี Win32 Mercurial - ไม่มีวิธีใดที่จะติดตั้งการผูกการโค่นล้มลงในไลบรารี Python ในตัว" ฉันกำลังใช้ TortoiseHg ...
David Lay

ใช้ Linux live CD หรือเครื่องเสมือน?
richq

นี่คือคำตอบที่ถูกต้อง ฉันได้ทำสิ่งนี้โดยใช้ hg convert extension เท่านั้น ( selenic.com/mercurial/wiki/… ) และใช้โปรโตคอลไฟล์สำหรับที่เก็บ SVN ที่ไม่มีนามสกุล pysvn: hg แปลงไฟล์: /// X: / HOME / REPOS / mysvnrep newhgrep
van

5

ในการแปลง SVN Repo เป็น HG Repo และคัดลอกไปยังเซิร์ฟเวอร์อื่นคุณจะต้องมีบางสิ่ง

  1. ติดตั้ง TortoiseHG (ตรวจสอบดูว่ากำลังใช้งานเวอร์ชันใดอยู่)
  2. ติดตั้ง Python แล้ว (ตรวจสอบดูว่ากำลังใช้งานเวอร์ชันใดอยู่)
  3. โมดูล Python (คุณสามารถค้นหาได้http://pysvn.tigris.org/project_downloads.html )
  4. คุณจะต้องเพิ่มconvertส่วนขยายให้กับ Tortoise เริ่ม TortoiseHG Workbench จากเมนู Start เลือกFile -> Settings. เลือกExtensionsจากรายการ ตรวจสอบconvertและคลิกตกลง

ก่อนอื่นการแปลง ...

  1. วิธีที่ดีที่สุดคือแมปโฟลเดอร์ที่ SVN Repo ปัจจุบันอยู่ในคอมพิวเตอร์ที่คุณกำลังทำงานอยู่ (เช่น\\server\folder อย่าแมปโฟลเดอร์ SVN Repo เองแมปโฟลเดอร์ไว้ด้านบน) ให้อักษรที่แมปแก่ไดรฟ์เช่นY:\
  2. เปิดพรอมต์คำสั่งและพิมพ์: CD /D Y:\
  3. ที่Y:\ประเภทพร้อมต์: hg convert y:/RepoName (ใช้ชื่อ Repo ปัจจุบัน) ระวังเครื่องหมายทับไปข้างหน้าและย้อนกลับ คำสั่งในคำสั่งคือเครื่องหมายทับ นอกจากนี้หากชื่อมีช่องว่างให้ใส่ชื่อในใบเสนอราคา (กล่าวคือY:/"My Repo folder")
  4. ตอนนี้มันควรจะทำงานแล้วและจะสร้างโฟลเดอร์อื่นควบคู่ไปกับโฟลเดอร์เก่า และโฟลเดอร์ hg ควรอยู่ด้านใน จะไม่เริ่มต้นและอย่าเริ่มต้น!
  5. การแปลงเสร็จสมบูรณ์

ประการที่สองการโคลน ...

  1. เปิด TortoiseHG Workbench ไปที่File -> Clone Repository
  2. ที่มา: ป้อนเส้นทางแบบเต็มของ repo ที่แปลงแล้ว
  3. ปลายทาง: ป้อนเส้นทางแบบเต็มของตำแหน่งที่คุณต้องการโคลน repo ไม่จำเป็นต้องสร้างโฟลเดอร์ที่ปลายทางใหม่เนื่องจากกระบวนการโคลนจะสร้างและเริ่มต้น
  4. เพิ่มสิทธิ์ในโฟลเดอร์โคลนใหม่
  5. เสร็จแล้ว !!!

สวัสดีเป็นไปได้ไหมที่จะอธิบายว่าทำไมคุณไม่ควรinitเป็นที่เก็บแรก
เบ็นเพจ

3

ยังไม่มีใครไม่พูดถึงhgsubversion ( Extension Wiki ) ซึ่งสามารถทำได้โดยแทบไม่ต้องปวดหัว (ยกเว้นกรณีที่หายากและต้นไม้เฉพาะ)

เพียงเพิ่มส่วนขยายเปิดใช้งานและhg clone SVN_REPOไปยัง repo mercurial ในพื้นที่


1

นี่คือคำถามที่พบบ่อยของ TortoiseHg :

ฉันจะแปลงที่เก็บการโค่นล้มเป็น Mercurial ได้อย่างไร

คุณต้องติดตั้งเครื่องมือบรรทัดคำสั่ง svn-win32-1.4.6 จากนั้นเพิ่มลงในพา ธ ของคุณ จากนั้นคุณต้องเปิดใช้งานส่วนขยายการแปลง ณ จุดนี้คุณควรจะใช้hg convertคำสั่ง '' เพื่อทำการแปลงได้ กรุณาส่งปัญหา / ข้อสงสัยเกี่ยวกับการขยายแปลงไปยังรายการ Mercurial ทางไปรษณีย์หรือบน#mercurialirc.freenode.net

เห็นได้ชัดว่าเป็นไปได้ - ฉันใช้ Linux จึงไม่ได้ลองด้วยตัวเอง


0

ฉันเพิ่งแปลง SVN repo ระยะไกลด้วย HTTP auth เป็น Mercurial repo และให้ฉันบอกคุณไม่มีเอกสารเกี่ยวกับวิธีการทำสิ่งนี้มากนัก ฉันต้องดาวน์โหลดซอร์ส Mercurial และติดตั้งแบบสแตนด์อโลนโดยใช้แพ็กเกจซอร์สวิธีนั้นการผูก SVN จะทำงานได้ถูกต้อง

ฉันติดตั้งแล้วเช่น:

python setup.py install

ซึ่งทำงานได้ดีบนกล่อง Server 2003 ของฉัน ตอนนี้ฉันสามารถแปลง SVN repo ด้วยวิธีที่ถูกต้องโดยทำสิ่งนี้:

python c:\python26\scripts\hg convert <remote repo>

เอกสารสำหรับ ConvertExtension บนเว็บไซต์ Mercurial นั้นไม่ชัดเจนนัก แต่มันบอกว่า:

ไม่มีวิธีใดในการติดตั้งการผูกการโค่นล้มลงในไลบรารี Python ในตัวของ [Mercurial] ดังนั้นคุณจะต้องใช้ Mercurial ที่ติดตั้งไว้บน Python แบบสแตนด์อะโลน

ตอนนี้ฉันใช้เวอร์ชันสแตนด์อะโลนสำหรับการแปลงและ TortoiseHg สำหรับงาน VCS จริง


0

มาสายดีกว่าไม่มาเลย ...

สองคำตอบในราคาเดียว ...

  1. หากเป็น repo สาธารณะโอเพ่นซอร์สคุณสามารถใช้http://svn2github.com/add/ซึ่งใช้เวลาประมาณครึ่งชั่วโมงในการโคลน repo นั้นไปยัง GitHib จากนั้นดึงข้อมูลนั้นมาไว้ใน Hg

  2. ข้อดีของการใช้hg convertคือสามารถกลับมาใช้งานต่อได้ แปลง SVN เพื่อปรอทสามารถใช้เวลาวัน หากคุณหยุดสิ่งนี้มันจะกลับมาทำงานต่อจากจุดที่ค้างไว้

ด้านล่างนี้เป็นไฟล์แบตช์ที่ฉันเขียนเนื่องจาก Codeplex SVNbridge ขยะ repo ในตัวอย่างนี้ใช้เวลาสองสามวันในการดึงข้อมูลประวัติทั้งหมด (ฉันอยู่ในออสเตรเลียดังนั้นเวลาในการตอบสนองอาจเป็นปัจจัยหนึ่ง) ฉันอยากจะคิดว่ามันทำให้เซิร์ฟเวอร์ TFS มีการเต้นที่ดี

ไฟล์แบตช์นี้สามารถทำงานได้ตลอดเวลาเพื่อดึงการอัปเดตจากแหล่ง SVN หากพวกเขาเป็นไฟล์เดียวที่เหลืออยู่บนโลกที่ยังคงใช้ SVN ฉันยังไม่ได้ทดสอบดังนั้นดูว่าจะเกิดอะไรขึ้นถ้าคุณทำเช่นนั้นถ้าฉันเป็นคุณฉันจะละทิ้งสาขาเดิมถ้าคุณจะแก้ไข repo

robocopy shamapสิ่งคือการรักษาประวัติ SVN ถ้าคุณโคลน repo ปรอท shamap เป็นชั่วคราว - ตรวจสอบแฟ้มชุดและ shamap ใน (ฉันจะทำอย่างนั้นในสาขาใหม่)

ชุด ...

@echo off
mode con:cols=100 lines=800

:: Change the SVN remote name here
::
set remote=https://cinch.svn.codeplex.com/svn
::

title Fetching SVN from %remote%. This could take...DAYS
echo .
echo Fetching SVN checkins from %remote%
echo .
echo Dependencies: Tortoise Hg and hg.exe in the Path would be ideal.
echo using hg convert
echo .
echo First, I will make a backup of shamap in the hg repo folder.
echo If shamap in .hg\ is newer then it will be copied to the repo.
echo You should commit it so hg clones of this repo work with this.
echo Commit this .BeeyATch file as well.
echo shamap keeps track of what has been fetched from SVN.
echo ok, that ends the educational part of this script...
echo Now I will fetch SVN changes from
echo %remote%
echo ...
echo ...(this could take quite some time)...
echo ...DAYS...yes...DAYS
echo ...especially if it's fecking Codeplex SVN...
echo .
echo If this craps out just run it again - it will resume from where it left off. 
echo and fetch the rest...eventually
echo .
echo Control C to abort or any other key to start:
echo .

pause

echo .
:: http://mercurial.selenic.com/wiki/ConvertExtension <== see for details of shamap
:: copy the shamap from the original convert into the .hg folder unless it is already there & newer
:: don't panic if shamap is much bigger than the original - diff it to see why
robocopy .\ .\.hg\ shamap /XO 
robocopy .\.hg\ .\ shamap /XO 
echo .

hg convert --verbose --debug %remote% "%CD%"
echo .
echo .
echo Finished fetching from %remote%
title Finished fetching from %remote%
echo Any  key to Exit
echo .
pause

exit

0

การใช้convertส่วนขยายของ Mercurial:

  1. เปิดใช้งานการขยายการแปลง เพิ่มconvert=ใน[extensions]ส่วนของ. hgrc ดังนี้:

    [นามสกุล]
    convert =

  2. Linux ต้องการการผูก python เพิ่มเติม: sudo apt-get install python-subversion
  3. ดำเนินการhg convertคำสั่ง
    • ดูhg convert -hเพื่อขอความช่วยเหลือ
    • ตัวอย่าง: hg convert http://[svnserver]/[Project] --source-type svn [DestinationDir] (ดูหมายเหตุ 2)
  4. พุชไปยังที่เก็บ Mercurial ที่สร้างขึ้นใหม่: hg push https://[mercurialserver]/[Project]

หมายเหตุ : คุณสามารถทำซ้ำคำสั่ง hg convert เพื่อรวมการเปลี่ยนแปลงใหม่ที่ทำในที่เก็บ svn หลังจากการแปลงครั้งก่อน

หมายเหตุ 2 : เมื่อการแปลง hg ไม่ทำงานโดยใช้http://หรือก่อนอื่นsvn://คุณสามารถเช็คเอาต์ที่เก็บการโค่นล้ม (หรืออัปเดตที่เก็บที่มีอยู่) และแปลงโดยใช้การชำระเงินภายในเครื่อง ตัวอย่าง:hg convert [DirectoryOfLocalCheckout] --source-type svn [DestinationDir]

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