ฉันจะย้ายที่เก็บ SVN พร้อมประวัติไปยังที่เก็บ Git ใหม่ได้อย่างไร


1509

ฉันอ่านคู่มือ Git, คำถามที่พบบ่อย, Git - SVN crash course ฯลฯ และพวกเขาทั้งหมดอธิบายสิ่งนี้และสิ่งนั้น แต่ไม่มีที่ไหนที่คุณจะพบคำแนะนำง่ายๆเช่น:

ที่เก็บ SVN ใน: svn://myserver/path/to/svn/repos

ที่เก็บ Git ใน: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

ฉันไม่คาดหวังว่ามันจะง่ายขนาดนั้นและฉันไม่คาดหวังว่ามันจะเป็นคำสั่งเดียว แต่ฉันคาดหวังว่ามันจะไม่พยายามอธิบายอะไร - เพียงแค่บอกว่าขั้นตอนที่ต้องทำในตัวอย่างนี้


6
มันเริ่มง่ายขึ้นฉันเพิ่งทำเสร็จเองและบันทึกผลการวิจัยของฉันด้วยความช่วยเหลือของ SO jmoses.co/2014/03/21/moving-from-svn-to-git.html
John Moses

ใช้คำตอบของ Casey ด้านล่าง แต่ก่อนที่คุณจะเรียกใช้คำสั่ง "svn clone ... " ดูวิธีเพิ่มบรรทัด "Visual SVN Server" พิเศษลงในไฟล์ user.txt ของคุณ ... ที่นี่: stackoverflow.com/questions/8971208/ …
MacGyver

1
นอกจากนี้หากคุณมีการ "ตรวจสอบตัวเลือกอีเมลส่วนตัวในโปรไฟล์ GitHub ของคุณให้ใช้นี่เป็นที่อยู่อีเมลของคุณใน users.txt เพื่อให้ตรงกัน yourgituser@users.noreply.github.com ดังนั้นที่อยู่อีเมลจริงของคุณจะไม่แสดงขึ้นมา ในความมุ่งมั่น
MacGyver

คำตอบ:


529

มายากล:

$ git svn clone http://svn/repo/here/trunk

Git และ SVN ทำงานแตกต่างกันมาก คุณต้องเรียนรู้ Git และถ้าคุณต้องการที่จะติดตามการเปลี่ยนแปลงจาก SVN git-svnต้นน้ำคุณต้องเรียนรู้ git-svn หน้าหลักมีส่วนตัวอย่างที่ดี :

$ git svn --help

140
คำตอบจาก @Casey ตอบคำถามต้นฉบับได้ดีขึ้นมาก
Doug Wilson

3
สิ่งนี้จะทำให้กิ่งไม้และทุกสิ่งหรือไม่ หรือเพียงแค่โคลนลำต้น?
Eildosa

7
@Eildosa: นี่จะโคลนลำต้น ดูคำตอบของ Casey สำหรับทางเลือกอื่น
sleske

3
@DougWilson แต่ฉันไม่เห็นคำตอบของ Casey ที่นี่ นี่เป็นคำตอบด้านล่างสำหรับผู้เขียน 13 คนที่ขึ้นต้นด้วย "สร้างไฟล์ผู้ใช้" หรือไม่?
Andrey Regentov

68
สำหรับคนอื่นที่สงสัยว่า "คำตอบของเคซี่ย์" ซึ่งมีการอ้างอิงในความคิดเห็นมากมายรอบ ๆ ที่นี่มันเป็นสิ่งนี้ (เคซี่ย์เปลี่ยนนิคของเขาเป็น cmcginty)
Stefan Monov

1560

สร้างไฟล์ผู้ใช้ (เช่นusers.txt) สำหรับทำแผนที่ผู้ใช้ SVN กับ Git:

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

คุณสามารถใช้หนึ่งซับในเพื่อสร้างเทมเพลตจากที่เก็บ SVN ที่มีอยู่ของคุณ:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

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

ตอนนี้ดึงข้อมูล SVN จากที่เก็บ:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

คำสั่งนี้จะสร้างที่เก็บ Git ใหม่dest_dir-tmpและเริ่มดึงที่เก็บ SVN โปรดทราบว่าการตั้งค่าสถานะ "--stdlayout" แสดงว่าคุณมี "trunk /, branch /, tags /" layout SVN ทั่วไป หากแตกต่างรูปแบบที่คุณคุ้นเคยกับ--tags, --branches, --trunkตัวเลือก (ทั่วไปgit svn help)

svn://โปรโตคอลร่วมกันทั้งหมดจะได้รับอนุญาต: http://, https://, URL ควรกำหนดเป้าหมายพื้นที่เก็บข้อมูลพื้นฐานบางอย่างเช่นhttp://svn.mycompany.com/myrepo/repository สตริง URL ต้องไม่รวมถึง/trunk, หรือ/tag/branches

โปรดทราบว่าหลังจากดำเนินการคำสั่งนี้บ่อยครั้งดูเหมือนว่าการดำเนินการจะ "หยุด / แช่แข็ง" และมันค่อนข้างปกติว่ามันจะติดอยู่เป็นเวลานานหลังจากเริ่มต้นพื้นที่เก็บข้อมูลใหม่ ในที่สุดคุณจะเห็นข้อความบันทึกซึ่งระบุว่ากำลังโยกย้าย

นอกจากนี้โปรดทราบว่าหากคุณไม่ใช้งาน--no-metadataสถานะ Git จะผนวกข้อมูลเกี่ยวกับการแก้ไข SVN ที่สอดคล้องกับข้อความการกระทำ (เช่นgit-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

หากไม่พบชื่อผู้ใช้ให้อัปเดตusers.txtไฟล์ของคุณแล้ว:

cd dest_dir-tmp
git svn fetch

คุณอาจต้องทำซ้ำคำสั่งสุดท้ายหลาย ๆ ครั้งถ้าคุณมีโครงการขนาดใหญ่จนกว่าการโค่นล้มการคอมมิททั้งหมดจะถูกดึงมา:

git svn fetch

เมื่อเสร็จแล้ว Git จะชำระเงิน SVN trunkเป็นสาขาใหม่ สาขาอื่น ๆ มีการตั้งค่าเป็นรีโมท คุณสามารถดูสาขา SVN อื่น ๆ ด้วย:

git branch -r

หากคุณต้องการเก็บสาขาระยะไกลอื่น ๆ ในที่เก็บของคุณคุณต้องการสร้างสาขาท้องถิ่นสำหรับแต่ละสาขาด้วยตนเอง (ข้ามลำตัว / หลัก) หากคุณไม่ทำเช่นนี้กิ่งจะไม่ถูกโคลนในขั้นตอนสุดท้าย

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

แท็กจะถูกนำเข้าเป็นสาขา คุณต้องสร้างสาขาท้องถิ่นสร้างแท็กและลบสาขาเพื่อให้พวกเขาเป็นแท็กใน Git วิธีทำด้วยแท็ก "v1":

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

โคลนที่เก็บ GIT-SVN ของคุณลงในที่เก็บ Git ที่สะอาด:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

สาขาท้องถิ่นที่คุณสร้างไว้ก่อนหน้านี้จากสาขาระยะไกลจะถูกคัดลอกเป็นสาขาระยะไกลลงในที่เก็บโคลนใหม่ (ข้ามลำตัว / หลัก) สำหรับแต่ละสาขาที่คุณต้องการเก็บ:

git checkout -b local_branch origin/remote_branch

ขั้นสุดท้ายให้ลบรีโมตออกจากที่เก็บ Clean Git ของคุณที่ชี้ไปยังที่เก็บชั่วคราวที่ถูกลบตอนนี้:

git remote rm origin

36
โพสต์บล็อกนี้โดย Eelke เป็นคำอ้างอิงโยงที่ยอดเยี่ยมสำหรับคำตอบข้างต้น blokspeed.net/blog/2010/09/converting-from-subversion-to-git
kgriffs

4
นี่คือ 99% ยอดเยี่ยมตามขั้นตอนเหล่านี้ฉันได้ทุกอย่างในการสั่งซื้อยกเว้นสาขา: หลังจากขั้นตอนสุดท้ายพวกเขาห่างไกลเท่านั้น (และหายไปเมื่อฉันทำคำสั่ง: ต้นกำเนิด rm ระยะไกล git)
Dirty Henry

4
GitHub มีขั้นตอนที่สะดวกมาก: github.com/nirvdrum/svn2git#readme
Dan Nissenbaum

8
สำหรับผู้ที่อยู่ภายใต้ Windows ฉันสร้างสคริปต์ PowerShell โดยใช้วิธีนี้: gist.github.com/Gimly/90df046dc38181bb18de
Gimly

5
คำเตือนสำหรับ Repos ขนาดใหญ่ที่มีจำนวนมากของประวัติศาสตร์นี้เป็นช้าและ tedius ฉันเลิกพยายามโยกย้ายกิ่งไม้เก่าทั้งหมดและย้ายลำต้นเพียงอย่างเดียว
Jess

195

หมดจดโยกย้ายของคุณโค่นล้ม Repository หากต้องการพื้นที่เก็บข้อมูล ก่อนอื่นคุณต้องสร้างไฟล์ที่จับคู่ Subversion commit ชื่อผู้แต่งของคุณกับ Git commit พูด~/authors.txt:

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

จากนั้นคุณสามารถดาวน์โหลดข้อมูลการโค่นล้มลงในที่เก็บ Git:

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

หากคุณบน Mac คุณจะได้รับgit-svnจาก MacPorts git-core +svnโดยการติดตั้ง

หากที่เก็บ subversion ของคุณอยู่ในเครื่องเดียวกับที่เก็บ git ที่คุณต้องการคุณสามารถใช้ไวยากรณ์นี้สำหรับขั้นตอน init ไม่เช่นนั้นจะเหมือนกันทั้งหมด:

git svn init file:///home/user/repoName --no-metadata

1
ขณะที่ผมแสดงความคิดเห็นในคำตอบอื่น ๆ ผมต้องลบช่องว่างรอบ=ในusers.txtเนื่องจากการนำเข้าที่ถูกยกเลิกและผมได้รับพื้นที่เก็บข้อมูลที่ว่างเปล่า
Sebastián Grignoli

8
อา! คำอธิบายที่ง่ายและมีประสิทธิภาพ ในกรณีของฉันfile:///ปฏิเสธที่จะทำงานฉันแค่ใช้svnserve.exe --daemonแล้วก็ใช้svn://localhost/home/user/repoแทน
Daniel Reis

ใน Mac ของฉันที่ใช้ Mountain Lion git svn จะไม่ทำงานจนกว่าฉันจะเข้าสู่ Xcode และติดตั้งเครื่องมือบรรทัดคำสั่งที่พบในแท็บดาวน์โหลดของบานหน้าต่างการตั้งค่า หรือฉันอาจติดตั้งเพียงเครื่องมือบรรทัดคำสั่งสำหรับ OS X Mountain Lion ที่พบในเว็บไซต์ Developer ของ Apple
ดึง

3
สำหรับกรณีของฉันฉันมีการแปลงไฟล์เพื่อauthors.txt utf-8 without BOM
Silvan

มันใช้งานได้ดีสำหรับฉัน! เมื่อฉันมีพื้นที่เก็บข้อมูลท้องถิ่นผมเคยโพสต์ cmcginty ของเริ่มต้นที่ "โคลนที่เก็บ GIT-SVN ของคุณให้เป็นพื้นที่เก็บข้อมูล Git สะอาด" ผมคิดว่าเหตุผลหลักที่ผมชอบ @zoul 's คำตอบก็คือคือการใช้git svn init, git svn configแล้วในที่สุดgit svn fetchขณะที่มันก็ง่าย เมื่อต้องการทำเช่นนี้ฉันต้องดึงหลายครั้งเพื่อให้ถูกต้อง บรรทัดเดียวของ cmcginty git svn cloneซึ่งทำทั้งสามอย่างนั้นยุ่ง เกินไปสำหรับฉัน
ไมค์

70

ฉันใช้สคริปต์ svn2gitและทำงานเหมือนมีเสน่ห์


4
ถาม: ช่องว่างการแก้ไขนี้ในแท็กและชื่อสาขา (อนุญาตใน svn และไม่อนุญาตใน git)
spazm

2
คู่มือนี้จะมีประโยชน์: troyhunt.com/2014/08/migrating-from-subversion-to-git-with.html
Morten Holmgaard

สิ่งนี้ล้มเหลวสำหรับฉันที่มีปัญหา: groups.google.com/forum/#!topic/msysgit/7MQVwRO-2N4 - ดูเพิ่มเติมที่ : github.com/nirvdrum/svn2git/issues/50 การแก้ปัญหาอยู่ที่นี่: stackoverflow.com/questions / 3009738 / …
HDave

เราควรอธิบายคำตอบมิฉะนั้นเราจะผลิตสคริปต์เด็ก
Josh Habdas

ถ้าสาขาของคุณอยู่ในรูทของ SVN และคุณไม่มีลำตัวหรือแท็กล่ะ
Kal

58

ฉันแนะนำให้ทำความคุ้นเคยกับ Git ก่อนที่จะพยายามใช้ git-svn อย่างสม่ำเสมอเช่นทำให้ SVN เป็น repo ส่วนกลางและใช้ Git ภายในเครื่อง

อย่างไรก็ตามสำหรับการย้ายข้อมูลอย่างง่าย ๆ พร้อมประวัติทั้งหมดต่อไปนี้เป็นขั้นตอนง่ายๆ:

เริ่มต้น repo ท้องถิ่น:

mkdir project
cd project
git svn init http://svn.url

ทำเครื่องหมายว่าคุณต้องการเริ่มนำเข้าการแก้ไขนานแค่ไหน:

git svn fetch -r42

(หรือเพียงแค่ "git svn fetch" สำหรับ revs ทั้งหมด)

เรียกทุกอย่างจริงตั้งแต่นั้นมา:

git svn rebase

คุณสามารถตรวจสอบผลลัพธ์ของการนำเข้าด้วย Gitk ฉันไม่แน่ใจว่ามันใช้งานได้กับ Windows มันใช้งานได้กับ OSX และ Linux:

gitk

เมื่อคุณมี repo SVN ของคุณถูกโคลนในพื้นที่คุณอาจต้องการที่จะผลักดันไปที่ repo Git ส่วนกลางเพื่อความร่วมมือที่ง่ายขึ้น

สร้าง repo ระยะไกลที่ว่างเปล่าก่อน (อาจจะเป็นGitHub ?):

git remote add origin git@github.com:user/project-name.git

จากนั้นเลือกซิงค์สาขาหลักของคุณเพื่อให้การดำเนินการดึงจะผสานต้นแบบระยะไกลกับต้นแบบในเครื่องของคุณโดยอัตโนมัติเมื่อทั้งคู่มีสิ่งใหม่:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

หลังจากนั้นคุณอาจสนใจลองgit_remote_branchใช้เครื่องมือของตัวเองซึ่งช่วยจัดการกับสาขาระยะไกล:

โพสต์คำอธิบายแรก: " Git remote branch "

ติดตามผลรุ่นล่าสุด: " ถึงเวลาคอมไพล์ที่ร่วมมือกับ git_remote_branch "


มีประโยชน์อย่างยิ่งมันทำงานได้อย่างสมบูรณ์แบบ ฉันจะเพิ่มว่ามีขั้นตอนสุดท้ายที่จะทำถ้าคุณกำลังซิงค์กับพื้นที่เก็บข้อมูลระยะไกล หลังจากขั้นตอนการตั้งค่า git ฉันจำเป็นต้องgit push origin master
mag382

31

มีโซลูชั่นใหม่สำหรับการโยกย้ายเรียบจากการโค่นล้มเพื่อ Git (หรือสำหรับการใช้ทั้งสองพร้อมกัน) คือSubGit

ฉันกำลังทำโครงงานนี้อยู่ เราใช้ SubGit ในที่เก็บข้อมูลของเรา - เพื่อนร่วมทีมของฉันบางคนใช้ Git และ Subversion และมันก็ใช้งานได้ดีมาก

ในการย้ายจากการโค่นล้มไป Git ด้วย SubGit คุณต้องเรียกใช้:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

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

ในกรณีที่ที่เก็บ Subversion ของคุณมีหลายโครงการดังนั้นที่เก็บ Git จำนวนมากจะถูกสร้างขึ้นในไดเรกทอรี svn_repos / git ในการปรับแต่งการแปลก่อนใช้งานให้ทำดังนี้:

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

ด้วยSubGitคุณสามารถโยกย้ายไปที่ Git บริสุทธิ์ (ไม่ใช่ git-svn) และเริ่มใช้งานได้ในขณะที่ยังคงใช้การโค่นล้มตราบเท่าที่คุณต้องการ (สำหรับเครื่องมือบิลด์ที่กำหนดค่าไว้แล้ว)

หวังว่านี่จะช่วยได้!


4
โปรดทราบว่าการนำเข้าครั้งเดียว (โดยใช้subgit importคำสั่ง) ดูเหมือนจะไม่จำเป็นต้องมีใบอนุญาต การแปลที่ถูกต้องของsvn:ignoreคุณสมบัติเป็น.gitignoreไฟล์รวมอยู่ด้วย
krlmlr

1
SubGit จะไม่รู้จักคีย์ส่วนตัวของฉันหรือค่าสถานะใด ๆ ที่ฉันตั้งไว้ในบรรทัดคำสั่ง เอกสารไม่ดีมาก git svnนี้ไม่ได้เป็นทางเลือกสำหรับ
pfnuesel

1
ข้อผิดพลาด: 'svn_repos' ไม่ใช่ตำแหน่งที่กำหนดค่าที่ถูกต้อง ไฟล์การกำหนดค่า SubGit หายไป
Jon Davis

19

ดูอย่างเป็นทางการmanpage Git-SVN โดยเฉพาะให้ดูที่ "ตัวอย่างพื้นฐาน":

การติดตามและสนับสนุนโครงการโค่นล้มที่ได้รับการจัดการทั้งหมด (สมบูรณ์ด้วยลำตัวแท็กและสาขา):

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

คำสั่งโคลนของคุณใช้งานได้, ผู้ที่อยู่ข้างบนไม่ได้ให้อะไรนอกจาก repit คอมไพล์เปล่า ความแตกต่างเพียงอย่างเดียวน่าจะเป็น '-T trunk' อย่างชัดเจน
user1984717


14

SubGit (เทียบกับ Blue Screen of Death)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

มันคือทั้งหมดที่

+ หากต้องการอัปเดตจาก SVN ที่เก็บ Git ที่สร้างโดยคำสั่งแรก

subgit import  directory/path/Local.git.Repo

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

นี่คือวิธีของฉัน

โซลูชันของฉันดูเหมือนว่า:

  • โอนย้าย SVN ไปยังที่เก็บ Git
  • อัพเดทพื้นที่เก็บข้อมูล Git ก่อนเปลี่ยนทีมไป

การโอนย้ายใช้เวลานานสำหรับที่เก็บ SVN ขนาดใหญ่
แต่การอัปเดตการย้ายข้อมูลเสร็จสมบูรณ์เพียงไม่กี่วินาที

แน่นอนฉันใช้SubGitแม่ Git-SVN ทำให้ฉันหน้าจอสีฟ้าแห่งความตาย เพียงแค่ตลอดเวลา และ git-svn ทำให้ฉันเบื่อด้วยข้อผิดพลาดร้ายแรง" ชื่อไฟล์ที่ยาวเกินไป " ของ Git

ขั้นตอน

1. ดาวน์โหลด SubGit

2.เตรียมคำสั่งโยกย้ายและอัปเดต

สมมติว่าเราทำเพื่อ Windows (มันเป็นเรื่องไม่สำคัญที่จะพอร์ตไปยัง Linux)
ในไดเรกทอรีbinการติดตั้งของ SubGit (subgit-2.XX \ bin) ให้สร้างไฟล์. bat สองไฟล์

เนื้อหาของไฟล์ / คำสั่งสำหรับการย้ายข้อมูล:

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

คำสั่ง "start" เป็นทางเลือกที่นี่ (Windows) มันจะช่วยให้เห็นข้อผิดพลาดในการเริ่มต้นและเปิดเปลือกทิ้งไว้หลังจากเสร็จสิ้น SubGit

คุณอาจจะเพิ่มที่นี่พารามิเตอร์เพิ่มเติมคล้ายกับ Git-SVN ฉันใช้--default-domain myCompanyDomain.comเพื่อแก้ไขโดเมนของที่อยู่อีเมลของผู้เขียน SVN
ฉันมีโครงสร้างของที่เก็บ SVN มาตรฐาน (trunk / กิ่ง / แท็ก) และเราไม่มีปัญหากับ "การแมปผู้เขียน" ดังนั้นฉันจะไม่ทำอะไรอีกแล้ว

(ถ้าคุณต้องการที่จะแท็กโยกย้ายเช่นสาขาหรือ SVN ของคุณมีหลายสาขา / โฟลเดอร์แท็กคุณอาจพิจารณาที่จะใช้มากขึ้นอย่างละเอียด SubGit วิธีการ )

เคล็ดลับที่ 1 : ใช้ - สุดยอด YourSvnRevNumber แก้ไขเพื่อดูว่าสิ่งที่เดือดออก (การดีบักบางชนิด) อย่างรวดเร็ว มีประโยชน์อย่างยิ่งคือการดูชื่อผู้แต่งหรืออีเมลที่ได้รับการแก้ไข
หรือเพื่อ จำกัด ความลึกประวัติการโยกย้าย

เคล็ดลับที่ 2 : การย้ายข้อมูลอาจถูกขัดจังหวะ ( Ctrl+ C) และเรียกคืนโดยการเรียกใช้คำสั่ง / ไฟล์การอัปเดตถัดไป
ฉันไม่แนะนำให้ทำเช่นนี้กับที่เก็บข้อมูลขนาดใหญ่ ฉันได้รับ "ข้อยกเว้น Java + Windows หน่วยความจำไม่เพียงพอ"

เคล็ดลับ 3 : ดีกว่าเพื่อสร้างสำเนาของที่เก็บผลลัพธ์เปลือยของคุณ

เนื้อหาของไฟล์ / คำสั่งสำหรับการอัพเดต:

start    subgit import  directory/path/Local.git.Repo

คุณสามารถเรียกใช้ได้ทุกครั้งที่คุณต้องการรับความมุ่งมั่นของทีมสุดท้ายในที่เก็บ Git ของคุณ

คำเตือน! อย่าแตะต้องพื้นที่เก็บข้อมูลเปล่า (เช่นการสร้างสาขา)
คุณจะได้รับข้อผิดพลาดร้ายแรงต่อไป:

ข้อผิดพลาดที่ไม่สามารถกู้คืนได้: ขาดการซิงค์และไม่สามารถซิงค์ ... การแปลการโค่นล้มการแก้ไขเป็น Git กระทำ ...

3.เรียกใช้คำสั่ง / ไฟล์แรก มันจะใช้เวลา loooong สำหรับพื้นที่เก็บข้อมูลขนาดใหญ่ 30 ชั่วโมงสำหรับพื้นที่เก็บข้อมูลต่ำต้อยของฉัน

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



มีงานที่มีประโยชน์มากกว่าหนึ่งรายการ

ผลักดันที่เก็บ Git ในพื้นที่ของคุณไปยังที่เก็บ Git ระยะไกล

เป็นกรณีของคุณหรือไม่ มาเริ่มกันเลยดีกว่า

  1. กำหนดค่ารีโมทของคุณ

วิ่ง:

$ git remote add origin url://your/repo.git
  1. เตรียมที่จะส่งเริ่มต้นของพื้นที่เก็บข้อมูล Git ขนาดใหญ่ของคุณไปยังพื้นที่เก็บข้อมูลระยะไกล

โดยค่าเริ่มต้น Git ของคุณไม่สามารถส่งชิ้นใหญ่ ร้ายแรง: ปลายระยะไกลวางสายโดยไม่คาดคิด

มาวิ่งกันเถอะ:

git config --global http.postBuffer 1073741824

524288000 - 500 MB 1073741824 - 1 GB และอื่น ๆ

แก้ไขในท้องถิ่นของคุณปัญหาใบรับรอง หากเซิร์ฟเวอร์ git ของคุณใช้ใบรับรองที่ใช้งานไม่ได้

ฉันมีคนพิการใบรับรอง

นอกจากนี้ยังเซิร์ฟเวอร์ Git ของคุณอาจจะมีจำนวนคำขอข้อ จำกัด จำเป็นต้องได้รับการแก้ไข

  1. พุชการโยกย้ายทั้งหมดไปยังที่เก็บ Git ระยะไกลของทีม

ทำงานกับ Git ท้องถิ่น:

git push origin --mirror

( ต้นกำเนิด git push '*: *'สำหรับ Git เวอร์ชั่นเก่า)

หากคุณได้รับสิ่งต่อไปนี้: ข้อผิดพลาด: ไม่สามารถวางไข่คอมไพล์: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว ... สำหรับฉันการเก็บข้อมูลทั้งหมดของฉันช่วยฉันแก้ไขข้อผิดพลาดนี้ (30 ชั่วโมง) คุณสามารถลองคำสั่งต่อไป

git push origin --all
git push origin --tags

หรือลองติดตั้ง Git ใหม่ ( ไร้ประโยชน์สำหรับฉัน ) หรือคุณอาจสร้างสาขาจากแท็กทั้งหมดและผลักพวกเขา หรือหรือหรือ ...


10

reposurgeon

สำหรับกรณีที่ซับซ้อน reposurgeon โดยEric S. Raymondเป็นเครื่องมือในการเลือก นอกเหนือไปจาก SVN จะสนับสนุนระบบอื่น ๆ อีกมากมายการควบคุมเวอร์ชันผ่านทางfast-exportรูปแบบและยังCVS ผู้เขียนรายงานการแปลงที่ประสบความสำเร็จของที่เก็บโบราณเช่นEmacsและFreeBSD

เครื่องมือนี้มีจุดมุ่งหมายที่การแปลงใกล้สมบูรณ์แบบ (เช่นการแปลงsvn:ignoreคุณสมบัติของ SVN ไปเป็น.gitignoreไฟล์) แม้สำหรับโครงร่างพื้นที่เก็บข้อมูลที่ยากซึ่งมีประวัติยาวนาน ในหลายกรณีเครื่องมืออื่น ๆ อาจใช้งานง่ายกว่า

ก่อนที่จะเจาะลึกลงไปในเอกสารประกอบของreposurgeonบรรทัดคำสั่งตรวจสอบให้แน่ใจว่าได้อ่านคู่มือการโยกย้าย DVCS ที่ยอดเยี่ยมซึ่งผ่านขั้นตอนการแปลงทีละขั้นตอน


8

คำแนะนำเกี่ยวกับเว็บไซต์ของ atlassian นี้เป็นหนึ่งในสิ่งที่ดีที่สุดที่ฉันได้พบ:

https://www.atlassian.com/git/migration

เครื่องมือนี้ - https://bitbucket.org/atlassian/svn-migration-scripts - ยังมีประโยชน์มากสำหรับการสร้างผู้สร้าง.txtของคุณเหนือสิ่งอื่นใด


หน้านี้วิเศษมากและเป็นคำตอบที่ดีที่สุดสำหรับ IMHO! มันทำเสียงฮึดฮัดส่วนใหญ่ทำงานให้คุณ
PfunnyGuy

8

คุณต้องติดตั้ง

git
git-svn

คัดลอกมาจากลิงค์นี้http://john.albin.net/git/convert-subversion-to-git

1. ดึงรายชื่อของผู้ทำการโค่นล้มทั้งหมด

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

จากรูทของการเช็กเอาต์การโค่นล้มท้องถิ่นให้รันคำสั่งนี้:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt

ที่จะดึงข้อความบันทึกทั้งหมดดึงชื่อผู้ใช้กำจัดชื่อผู้ใช้ที่ซ้ำกันเรียงลำดับชื่อผู้ใช้และวางไว้ในไฟล์ “hors-transform.txt” ตอนนี้แก้ไขแต่ละบรรทัดในไฟล์ ตัวอย่างเช่นแปลง:

jwilkins = jwilkins <jwilkins>

เป็นนี้

jwilkins = John Albin Wilkins <johnalbin@example.com>

2. โคลนพื้นที่เก็บข้อมูลการโค่นล้มโดยใช้ git-svn

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

สิ่งนี้จะทำการแปลง git-svn มาตรฐาน (โดยใช้ไฟล์ author-transform.txt ที่คุณสร้างขึ้นในขั้นตอนที่ 1) และวางที่เก็บ git ในโฟลเดอร์“ ~ / temp” ภายในไดเรกทอรีหลักของคุณ

3. แปลง svn: ละเว้นคุณสมบัติเป็น. gitignore

หาก svn repo ของคุณใช้คุณสมบัติ svn: ละเว้นคุณสามารถแปลงไฟล์นี้เป็นไฟล์. gitignore ได้อย่างง่ายดายโดยใช้:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4. กดที่เก็บไปยังที่เก็บ git เปลือย

ก่อนอื่นให้สร้างที่เก็บเปลือยและทำให้สาขาเริ่มต้นตรงกับชื่อสาขา "ลำต้น" ของ svn

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

จากนั้นผลักดันที่เก็บ temp ไปยังที่เก็บเปลือยใหม่

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

ตอนนี้คุณสามารถลบที่เก็บ ~ / temp ได้อย่างปลอดภัย

5. เปลี่ยนชื่อสาขา“ ลำต้น” เป็น“ ต้นแบบ”

สาขาการพัฒนาหลักของคุณจะถูกตั้งชื่อว่า "ลำตัว" ซึ่งตรงกับชื่อที่อยู่ในการโค่นล้ม คุณจะต้องการเปลี่ยนชื่อเป็นสาขา "ต้นแบบ" มาตรฐานของ Git โดยใช้:

cd ~/new-bare.git
git branch -m trunk master

6. ทำความสะอาดกิ่งไม้และแท็ก

git-svn สร้างแท็ก Subversions ทั้งหมดลงในกิ่งที่สั้นมากใน Git ของฟอร์ม“ tags / name” คุณจะต้องการแปลงกิ่งเหล่านั้นทั้งหมดให้เป็นแท็ก Git จริงโดยใช้:

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

ขั้นตอนนี้จะใช้เวลาพิมพ์เล็กน้อย :-) แต่ไม่ต้องกังวล เชลล์ unix ของคุณจะให้พรอมต์สำรองสำหรับคำสั่งที่ยาวเป็นพิเศษซึ่งเริ่มต้นด้วย git สำหรับการอ้างอิงแต่ละครั้ง


7

GitHub ตอนนี้มีคุณสมบัติในการเข้าจากพื้นที่เก็บข้อมูล SVN ฉันไม่เคยลองเลย


3
GitHub ของข้อเสนอแนะในปัจจุบันคือการใช้svn2gitโปรแกรมข้อเสนอแนะในคำตอบอื่น
ntc2

นำเข้าสองโครงการที่ค่อนข้างใหญ่ตอนนี้ไร้ที่ติ สาขา SVN ทั้งหมดได้รับการนำเข้าแล้ว (อย่าลืมว่าใช้ส่วน \ trunk ในเส้นทาง repo) สิ่งหนึ่งที่ฉันยังไม่รู้ก็คือว่า Github จะติดตามการกระทำใหม่หรือไม่
Fr0sT

7

คำตอบที่ขยายค่อนข้างใช้เพียง git, SVN และทุบตี มันมีขั้นตอนสำหรับที่เก็บ SVN ที่ไม่ได้ใช้โครงร่างแบบเดิมพร้อมกับโครงร่างไดเรคทอรีลำต้น / กิ่ง / แท็ก (SVN ไม่ทำสิ่งใดเลยในการบังคับใช้เค้าโครงประเภทนี้)

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

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <USER@DOMAIN>";
done

ใช้สิ่งนี้เพื่อสร้างauthorsไฟล์ที่คุณแมปชื่อผู้ใช้ svn กับชื่อผู้ใช้และอีเมลที่กำหนดโดยนักพัฒนาของคุณโดยใช้git configคุณสมบัติuser.nameและuser.email(โปรดทราบว่าสำหรับบริการเช่น GitHub มีเพียงอีเมลที่ตรงกันเท่านั้น)

จากนั้นให้git svnโคลนที่เก็บ svn ไปยังที่เก็บ git โดยบอกเกี่ยวกับการทำแผนที่:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

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

การเรียกใช้สิ่งนี้บนเซิร์ฟเวอร์ในเครือข่ายเดียวกันหรือบนเซิร์ฟเวอร์เดียวกันสามารถเพิ่มความเร็วได้เช่นกัน นอกจากนี้หากกระบวนการนี้ถูกขัดจังหวะด้วยเหตุผลบางประการคุณสามารถใช้งานต่อได้

git svn rebase --continue

ในหลายกรณีคุณทำที่นี่ แต่ถ้า repo SVN ของคุณมีเลย์เอาต์ที่ไม่ธรรมดาที่คุณมีไดเร็กตอรี่ใน SVN คุณต้องการใส่ในสาขา git คุณสามารถทำขั้นตอนเพิ่มเติมได้

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

คุณสามารถทำได้โดยใช้คอมไพล์ สำหรับgit svn cloneใช้ไดเรกทอรีที่คุณต้องการใส่ใน git branch

หลังจากวิ่ง

git branch --set-upstream master git-svn
git svn rebase

โปรดทราบว่าต้องใช้ Git 1.7 ขึ้นไป


ฉันจะเสนอให้รวมข้อมูลนี้กับลิงก์นี้: sailmaker.co.uk/blog/2013/05/05/ …
Joan PS

7

ฉันได้โพสต์คำแนะนำทีละขั้นตอน ( ที่นี่ ) เพื่อแปลง svn เป็น git รวมถึงการแปลงแท็ก svn ในแท็ก git และสาขา svn ในเป็นสาขา git

เวอร์ชั่นสั้น:

1) โคลน svn จากหมายเลขการแก้ไขเฉพาะ (หมายเลขการแก้ไขต้องเก่าที่สุดที่คุณต้องการย้ายข้อมูล)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2) ดึงข้อมูล svn ขั้นตอนนี้เป็นขั้นตอนที่ใช้เวลามากที่สุด

cd gitreponame
git svn fetch

ทำ git svn ซ้ำจนกว่าจะเสร็จสิ้นโดยไม่มีข้อผิดพลาด

3) รับการอัพเดทข้อมูลหลัก

git svn rebase

4) สร้างสาขาท้องถิ่นจากสาขา svn โดยคัดลอกข้อมูลอ้างอิง

cp .git/refs/remotes/origin/* .git/refs/heads/

5) แปลง svn tags ให้เป็น git tags

git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6) วางที่เก็บที่ดีกว่าเช่น GitHub

git remotes add newrepo git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

หากคุณต้องการรายละเอียดเพิ่มเติมอ่านโพสต์ของฉันหรือถามฉัน


6

เราสามารถใช้git svn cloneคำสั่งดังต่อไปนี้

  • svn log -q <SVN_URL> | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors.txt

คำสั่งด้านบนจะสร้างไฟล์ผู้แต่งจากคำสั่ง SVN

  • svn log --stop-on-copy <SVN_URL>

คำสั่งด้านบนจะให้หมายเลขการแก้ไขครั้งแรกเมื่อสร้างโครงการ SVN ของคุณ

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

คำสั่งด้านบนจะสร้างที่เก็บ Git ในเครื่อง

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

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$$ git checkout -b MyDevBranch origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$

สำหรับแท็ก:

$git checkout origin/tags/MyDevBranch-1.0
Note: checking out 'origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from origin/tags/MyDevBranch-1.0)
  MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$

ตอนนี้ดันมาสเตอร์กิ่งและแท็กไปยังที่เก็บ git ระยะไกล

$ git push origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

โปรแกรมอรรถประโยชน์ svn2git

ยูทิลิตี้svn2gitลบความพยายามด้วยตนเองกับสาขาและแท็ก

sudo gem install svn2gitติดตั้งโดยใช้คำสั่ง หลังจากนั้นเรียกใช้คำสั่งด้านล่าง

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

ตอนนี้คุณสามารถแสดงรายการกิ่งแท็กและผลักดันได้อย่างง่ายดาย

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git push origin master MyDevBranch MyDevBranch-1.0

ลองนึกภาพคุณมี 20 สาขาและแท็ก svn2git เห็นได้ชัดว่าจะช่วยคุณประหยัดเวลาได้มากและนั่นเป็นสาเหตุที่ฉันชอบมันดีกว่าคำสั่งพื้นฐาน มันเป็นเสื้อคลุมที่ดีรอบgit svn cloneคำสั่งพื้นเมือง

สำหรับตัวอย่างที่สมบูรณ์โปรดดูของฉันรายการบล็อก


5

TortoiseGit ทำสิ่งนี้ ดูโพสต์บล็อกนี้: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients

ใช่ฉันรู้ว่าการตอบด้วยการเชื่อมโยงไม่ได้ยอดเยี่ยม แต่มันเป็นทางออกใช่มั้ย


ลองใช้เครื่อง wayback ที่ archive.org
CAD bloke


3

หากคุณใช้ SourceTree คุณสามารถทำได้โดยตรงจากแอพ ไปที่ไฟล์ -> ใหม่ / โคลนแล้วทำสิ่งต่อไปนี้:

  1. ป้อน URL SVN ระยะไกลเป็น "เส้นทางที่มา / URL"
  2. ป้อนข้อมูลรับรองของคุณเมื่อได้รับแจ้ง
  3. ป้อนตำแหน่งโฟลเดอร์ท้องถิ่นเป็น "เส้นทางปลายทาง"
  4. ตั้งชื่อ
  5. ในตัวเลือกขั้นสูงเลือก "Git" จากดรอปดาวน์ใน "Create local repository ประเภท"
  6. คุณสามารถเลือกระบุการแก้ไขที่จะโคลนได้
  7. Hit Clone

เปิด repo ใน SourceTree และคุณจะเห็นข้อความการคอมมิชชันของคุณถูกย้ายด้วย

ตอนนี้ไปที่ Repository -> การตั้งค่า Repository และเพิ่มรายละเอียด repo ระยะไกลใหม่ ลบรีโมต SVN หากคุณต้องการ (ฉันทำสิ่งนี้ผ่านตัวเลือก "แก้ไขไฟล์กำหนดค่า"

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


ขอบคุณสุดยอดและรวดเร็ว!
Rikard

ขอบคุณมันใช้งานได้สำหรับฉันฉันใช้ SourceTree และ Stash
VK_217

3

สำหรับผู้ใช้GitLabฉันได้เขียนสรุปสาระสำคัญเกี่ยวกับวิธีการย้ายข้อมูลของฉันจาก SVN ที่นี่:

https://gist.github.com/leftclickben/322b7a3042cbe97ed2af

ขั้นตอนในการย้ายจาก SVN ไปยัง GitLab

ติดตั้ง

  • SVN svn.domain.com.auเป็นเจ้าภาพที่
  • SVN สามารถเข้าถึงได้ผ่านhttp(โปรโตคอลอื่น ๆ ควรทำงาน)
  • GitLab มีโฮสต์ที่git.domain.com.auและ:
    • กลุ่มถูกสร้างขึ้นด้วยการ dev-teamnamespace
    • มีการสร้างบัญชีผู้ใช้อย่างน้อยหนึ่งรายการเพิ่มในกลุ่มและมีคีย์ SSH สำหรับบัญชีที่ใช้สำหรับการย้ายข้อมูล (ทดสอบโดยใช้ssh git@git.domain.com.au)
    • โครงการfavourite-projectถูกสร้างในdev-teamเนมสเปซ
  • ไฟล์users.txtมีรายละเอียดผู้ใช้ที่เกี่ยวข้องผู้ใช้หนึ่งรายต่อบรรทัดของแบบฟอร์มusername = First Last <address@domain.com.au>โดยusernameมีชื่อผู้ใช้ที่ระบุในบันทึก SVN (ดูลิงค์แรกในส่วนการอ้างอิงเพื่อดูรายละเอียดโดยเฉพาะคำตอบของผู้ใช้ Casey)

รุ่น

  • เวอร์ชันการโค่นล้ม 1.6.17 (r1128011)
  • git เวอร์ชั่น 1.9.1
  • GitLab เวอร์ชัน 7.2.1 ff1633f
  • เซิร์ฟเวอร์ Ubuntu 14.04

คำสั่ง

bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab master

แค่นั้นแหละ! โหลดหน้าโครงการใน GitLab web UI อีกครั้งและคุณจะเห็นการกระทำและไฟล์ทั้งหมดที่อยู่ในรายการ

หมายเหตุ

  • หากมีผู้ใช้ที่ไม่รู้จักgit svn cloneคำสั่งจะหยุดซึ่งในกรณีนี้, อัพเดทusers.txt, cd favourite-projectและgit svn fetchจะดำเนินต่อไปจากที่ที่มันหยุด
  • มาตรฐานtrunk- tags- branchesรูปแบบสำหรับพื้นที่เก็บข้อมูล SVN เป็นสิ่งจำเป็น
  • SVN URL ที่กำหนดให้git svn cloneคำสั่งหยุดที่ระดับเหนือtrunk/, และtags/branches/
  • git svn cloneคำสั่งผลิตจำนวนมากของการส่งออกรวมทั้งคำเตือนบางอย่างที่ด้านบน; ฉันไม่สนใจคำเตือน

แม้ว่าลิงก์นี้อาจตอบคำถามได้ดีกว่าหากรวมส่วนสำคัญของคำตอบไว้ที่นี่และให้ลิงก์สำหรับการอ้างอิง คำตอบสำหรับลิงค์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงนั้นเปลี่ยนแปลง
Blackhole

1
ฉันไม่เห็นด้วย. เนื้อหาที่เชื่อมโยงอาจมีการเปลี่ยนแปลงและเนื้อหาที่ทำซ้ำที่นี่จะไม่ได้รับการอัปเดตดังนั้นจึงอาจล้าสมัย (และที่จริงแล้วฉันเชื่อว่ามีการเปลี่ยนแปลงตั้งแต่ฉันโพสต์คำตอบแรก) แนวทางบอกว่ารวมบริบทที่เกี่ยวข้องสำหรับลิงก์ซึ่งฉันทำแล้วเท่านั้น - คำถามที่แท้จริงได้รับคำตอบจากลิงค์ การคัดลอกทรัพยากรที่เชื่อมโยงทั้งหมดที่นี่ไม่จำเป็นหรือจำเป็น ฉันถูกลงคะแนนสำหรับเรื่องนี้หรือไม่!
leftclickben

2

อีกวิธีหนึ่งคือคำสั่ง git-stash เป็นสวรรค์เมื่อพยายามที่จะคอมไพล์ด้วย git-svn dcommits

กระบวนการทั่วไป:

  1. ตั้งค่า repo คอมไพล์
  2. ทำงานบางอย่างกับไฟล์ที่แตกต่างกัน
  3. ตัดสินใจที่จะตรวจสอบงานบางส่วนโดยใช้ git
  4. ตัดสินใจที่จะ svn-dcommit
  5. รับข้อผิดพลาด "ไม่สามารถกระทำด้วยดัชนีสกปรก" ได้

วิธีแก้ปัญหา (ต้องมีคอมไพล์ 1.5.3+):

git stash; git svn dcommit ; git stash apply

2

นี่คือเชลล์สคริปต์แบบง่ายที่ไม่มีการขึ้นต่อกันที่จะแปลงที่เก็บ SVN หนึ่งรายการขึ้นไปเป็น git และส่งไปที่ GitHub

https://gist.github.com/NathanSweet/7327535

ในสคริปต์ประมาณ 30 บรรทัด: โคลนโดยใช้ git SVN สร้างไฟล์. gitignore จาก SVN :: ละเว้นคุณสมบัติผลักเข้าไปในพื้นที่เก็บข้อมูล git เปลือยเปลี่ยนชื่อลำต้น SVN เป็นหลักแปลงแท็ก SVN เป็นแท็ก git และผลักดันให้ GitHub ในขณะที่รักษาแท็ก

ฉันผ่านความเจ็บปวดมากมายเพื่อย้ายคลัง SVN โหลจาก Google Code ไปยัง GitHub มันไม่ได้ช่วยให้ฉันใช้ Windows Ruby ทุกอย่างแตกในกล่อง Debian เก่าของฉันและการทำให้ Windows ทำงานได้เป็นเรื่องตลก โซลูชันอื่น ๆ ล้มเหลวในการทำงานกับเส้นทาง Cygwin แม้กระทั่งเมื่อฉันทำงานบางอย่างฉันก็ไม่สามารถหาวิธีที่จะทำให้แท็กปรากฏบน GitHub (ความลับคือ - ติดตามแท็ก)

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


2
ฉันใช้สคริปต์นี้ หลังจากผ่านไปเล็กน้อยและมีข้อผิดพลาดมันใช้งานได้สำหรับฉัน โปรดทราบว่าคุณต้องการGit 1.8.3+สำหรับสิ่งนี้เนื่องจาก --follow-tags ได้รับการสนับสนุนหลังจากนั้นเท่านั้น
nrobey

2

ฉันบนเครื่อง windows และสร้างแบทช์ขนาดเล็กเพื่อถ่ายโอน repo SVN ที่มีประวัติ (แต่ไม่มีสาขา) ไปยัง repo GIT เพียงแค่โทร

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

บางทีใคร ๆ ก็สามารถใช้มันได้ มันสร้างโฟลเดอร์ TMP เช็คเอาต์ SVN repo ที่นั่นด้วย git และเพิ่มต้นกำเนิดใหม่แล้วพุชมัน ... และลบโฟลเดอร์อีกครั้ง

@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add origin %TO% 
git push --set-upstream origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

คุณยังคงต้องการ users.txt ด้วยเช่นการแม็พผู้ใช้ของคุณ

User1 = User One <u.1@xxx.com>

คำตอบนี้ช่วยให้ฉันย้ายที่เก็บข้อมูลทั้งหมดของฉันไปยัง BitBucket ได้โดยไม่มีปัญหา
Gonzalingui

ดีใจที่ได้ยิน. ฉันมีประสบการณ์กับ Gitea เท่านั้น ... แต่ได้รับการโอนย้าย ~~ 40 repos ด้วยวิธีนี้
cljk

ดีมาก! ขอบคุณ
b3wii

คำเตือน; ฉันประสบปัญหาชุดอักขระที่ไม่ดี ฉันจำได้ว่ามันสายเกินไป แต่ฉันใช้เวลาซ่อมหลายชั่วโมง โปรดตรวจสอบว่า repo ที่คุณได้รับมีแหล่งที่แน่นอน (!)
cljk

1

ฉันแค่ต้องการเพิ่มการมีส่วนร่วมในชุมชน Git ฉันเขียนสคริปต์ทุบตีง่ายซึ่งนำเข้าแบบเต็มโดยอัตโนมัติ ไม่เหมือนกับเครื่องมือย้ายข้อมูลอื่น ๆ เครื่องมือนี้ใช้ git ดั้งเดิมแทน jGit เครื่องมือนี้ยังสนับสนุนที่เก็บที่มีประวัติการแก้ไขขนาดใหญ่และหรือ blobs ขนาดใหญ่ มันสามารถใช้ได้ผ่าน GitHub:

https://github.com/onepremise/SGMS

สคริปต์นี้จะแปลงโครงการที่เก็บใน SVN ด้วยรูปแบบต่อไปนี้:

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

โครงการนี้ได้รับความนิยมและได้รับการสนับสนุนเช่นกัน:

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

แต่ละโครงการจะได้รับการซิงโครไนซ์ด้วยชื่อโครงการ:

Ex: ./migration https://svnurl.com/basepath project1

หากคุณต้องการแปลง repo เต็มให้ใช้ไวยากรณ์ต่อไปนี้:

Ex: ./migration https://svnurl.com/basepath .

0

การใช้ Git อย่างมีประสิทธิภาพด้วยการโค่นล้มเป็นการแนะนำ Git -svn อย่างนุ่มนวล สำหรับที่เก็บของ SVN ที่มีอยู่ git-svn ทำให้เป็นเรื่องง่ายสุด ๆ หากคุณเริ่มที่เก็บใหม่มันจะง่ายกว่ามากในการสร้างพื้นที่เก็บข้อมูล SVN ที่ว่างเปล่าก่อนแล้วจึงนำเข้าโดยใช้ git-svn มากกว่าที่จะไปในทิศทางตรงกันข้าม การสร้างที่เก็บ Git ใหม่จากนั้นนำเข้าสู่ SVN สามารถทำได้ แต่มันค่อนข้างเจ็บปวดโดยเฉพาะอย่างยิ่งถ้าคุณยังใหม่กับ Git และหวังว่าจะรักษาประวัติการกระทำ


0

ดาวน์โหลดตัวติดตั้ง Ruby สำหรับ Windows และติดตั้งเวอร์ชันล่าสุดด้วย เพิ่ม Ruby executables ให้กับพา ธ ของคุณ

  • ติดตั้ง svn2git
  • เมนูเริ่ม -> โปรแกรมทั้งหมด -> ทับทิม -> เริ่มพร้อมท์คำสั่งด้วยทับทิม
  • จากนั้นพิมพ์“ gem install svn2git” และป้อน

    โอนย้ายคลังเก็บการโค่นล้ม

  • เปิดพรอมต์คำสั่ง Ruby และไปที่ไดเรกทอรีที่จะย้ายไฟล์

    จากนั้น svn2git http: // [ชื่อโดเมน ] / svn / [รากที่เก็บ]

  • อาจใช้เวลาสองสามชั่วโมงในการโยกย้ายโครงการไปยัง Git ขึ้นอยู่กับขนาดรหัสโครงการ

  • ขั้นตอนสำคัญนี้ช่วยในการสร้างโครงสร้างที่เก็บ Git ดังที่กล่าวไว้ด้านล่าง

    ลำต้น SVN (/ Project_components) -> Git master สาขา SVN (/ Project_components) -> สาขา Git แท็ก SVN (/ Project_components) -> แท็ก Git

สร้างที่เก็บระยะไกลและผลักดันการเปลี่ยนแปลง


0

GitHub มีผู้นำเข้า เมื่อคุณสร้างพื้นที่เก็บข้อมูลแล้วคุณสามารถนำเข้าจากพื้นที่เก็บข้อมูลที่มีอยู่ผ่าน URL มันจะขอข้อมูลประจำตัวของคุณถ้ามีและไปจากที่นั่น

ขณะที่ทำงานอยู่มันจะค้นหาผู้แต่งและคุณสามารถแมปกับผู้ใช้บน GitHub ได้

ตอนนี้ฉันใช้มันเพื่อเก็บข้อมูลสองสามอันและมันก็ค่อนข้างแม่นยำและเร็วขึ้นมาก! ใช้เวลา 10 นาทีสำหรับที่เก็บที่มีการคอมมิตถึง 4,000 ครั้งและหลังจากนั้นก็พาเพื่อนของฉันไปสี่วัน!


0

คำตอบมากมายที่นี่อ้างถึงhttps://github.com/nirvdrum/svn2gitแต่สำหรับที่เก็บข้อมูลขนาดใหญ่สิ่งนี้อาจช้า ฉันลองใช้https://github.com/svn-all-fast-export/svn2gitแทนซึ่งเป็นเครื่องมือที่มีชื่อเดียวกันทั้งหมด แต่ใช้เพื่อย้าย KDE จาก SVN ไปยัง Git

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


0

มีวิธีการต่าง ๆ เพื่อให้บรรลุเป้าหมายนี้ ฉันได้ลองใช้แล้วและพบว่าใช้งานได้จริงเพียงแค่ติดตั้ง git และ svn บน Windows OS

วิชาบังคับก่อน:

  1. git บน windows (ฉันใช้อันนี้) https://git-scm.com/
  2. svn พร้อมติดตั้งเครื่องมือคอนโซล (ฉันใช้ Tortoise svn)
  3. ไฟล์ดัมพ์ของที่เก็บ SVN ของคุณ svnadmin dump /path/to/repository > repo_name.svn_dump

ขั้นตอนในการบรรลุเป้าหมายสุดท้าย (ย้ายพื้นที่เก็บข้อมูลทั้งหมดที่มีประวัติไปยัง git, git ท้องถิ่นก่อนจากนั้นรีโมต)

  1. สร้างพื้นที่เก็บข้อมูลว่างเปล่า (โดยใช้เครื่องมือคอนโซลหรือ tortoiseSVN) ในไดเรกทอรี REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDERใส่ dumpfile.dump ลงใน REPO_NAME_PARENT_FOLDER

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump รอการดำเนินการนี้อาจจะนาน

  3. คำสั่งนี้เงียบดังนั้นเปิดหน้าต่าง cmd ที่สอง: svnserve -d -R --root REPO_NAME_FOLDER ทำไมไม่ใช้ไฟล์: /// ...... ? สาเหตุคำสั่งถัดไปจะล้มเหลวด้วยUnable to open ... to URL:คำตอบhttps://stackoverflow.com/a/6300968/4953065

  4. สร้างโฟลเดอร์ใหม่ SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. git svn โคลน svn: // localhost / รอการดำเนินการนี้

ในที่สุดเราได้อะไร

ให้ตรวจสอบพื้นที่เก็บข้อมูลท้องถิ่นของเรา:

git log

เห็นความมุ่งมั่นก่อนหน้าของคุณ? ถ้าใช่ - โอเค

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

git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags

ในกรณีของฉันฉันไม่ต้องการคำสั่งแท็กทำให้ repo ของฉันไม่มีแท็ก

โชคดี!


0

การแปลง svn submodule / folder 'MyModule' เป็น git พร้อมประวัติโดยไม่มีแท็กหรือสาขา

ในการเก็บรายการ svn ที่ไม่ใช้งานให้ใช้ความคิดเห็นด้านบนหลังจากขั้นตอนที่ 1

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