วิธีการ git-svn โคลน n แก้ไขครั้งล่าสุดจากพื้นที่เก็บข้อมูลการโค่นล้ม?


314

ปัญหา

คุณจะสร้างสำเนาตื้น ๆ ด้วย git-svn จากแหล่งเก็บข้อมูลการโค่นล้มได้อย่างไรเช่นคุณจะดึงเฉพาะการแก้ไขสามครั้งล่าสุดได้อย่างไร

git cloneคำสั่งจะได้รับการแก้ไข n ที่ผ่านมาจากที่เก็บ Git ถ้าคุณใช้ตัวเลือก--depthคือคุณได้รับสำเนาตื้นของพื้นที่เก็บข้อมูล ตัวอย่าง:

git clone --depth 3 git://some/repo myshallowcopyrepo

มีตัวเลือกที่คล้ายกันสำหรับ git-svn?

การค้นพบของฉันจนถึงตอนนี้

จนถึงตอนนี้ฉันเพิ่งพบ-rNตัวเลือกที่Nจะแก้ไขการดึง ตัวอย่าง:

git svn clone -rN svn://some/repo

-r$REVNUMBER:HEADตามเอกสารที่มีความเป็นไปได้ที่จะใช้ ฉันลองทำสิ่งต่อไปนี้เพื่อรับการแก้ไข 3 ครั้งล่าสุดซึ่งส่งคืนข้อความแสดงข้อผิดพลาด

$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn

ดังนั้นฉันจึงแทนที่HEAD~3ด้วยจำนวนจริงของการแก้ไขครั้งที่สาม แต่ครั้งล่าสุด 534 ที่ได้ผล แต่นั่นต้องให้ฉันคิดเลขการแก้ไขครั้งที่สาม แต่การกระทำครั้งสุดท้าย

$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .

เอกสาร

คอมไพล์โคลน

Git-SVN


6
ตอบคำถามของฉันเอง: -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.( แต่ไม่ได้ทำงานสำหรับฉัน)
เซบาสเตียน Grignoli

ว่ามันยากที่จะใช้--depthสำหรับการgit svnตั้งแต่การสนับสนุนที่มีอยู่แล้ว และมันมีอยู่แล้วเพื่อหา rev ล่าสุดจากเซิร์ฟเวอร์?
Peter Cordes

คำตอบ:


238

คุณค้นพบวิธีที่ง่ายที่สุดในการระบุโคลนตื้นใน Git-SVN โดยระบุหมายเลขการแก้ไข SVN ที่คุณต้องการเริ่มการโคลนของคุณที่ ( -r$REV:HEAD)

ตัวอย่างเช่น: git svn clone -s -r1450:HEAD some/svn/repo

โครงสร้างข้อมูลของ Git นั้นขึ้นอยู่กับพอยน์เตอร์ในกราฟอะคิลิกกำกับ (DAG) ซึ่งทำให้ไม่สามารถเดินกลับnได้ แต่ใน SVN (และใน Git-SVN) คุณจะต้องค้นหาหมายเลขการแก้ไขด้วยตัวเอง


5
จะเป็นอย่างไรถ้าฉันต้องการคัดลอกการแก้ไขก่อนหน้านี้ในอนาคต
Zennichimaro

5
@Zennichimaro: คุณสามารถทำได้โดยเพิ่มการgit-svnชี้ระยะไกลอื่นในที่เดียวกันและใช้git-svn fetchเพื่อรับต้นไม้มากขึ้น ณ จุดนี้คุณต้องใช้git filter-branchเพื่อซ่อมแซมต้นไม้เก่า (บางส่วน) ลงบนกิ่งขวา
Ben Jackson

Paul มีวิธีใดบ้างที่ฉันจะได้รับการแก้ไขล่าสุดโดยการทำการโยกย้ายเพิ่มเติมจาก SVN ไปยัง Git ( stackoverflow.com/questions/29161646/… )
SabareeshSS

1
SVN ใช้ integers ติดต่อเพื่อแจ้งการแก้ไขทำให้มันยิ่งน่ารำคาญมากขึ้นที่จะเดินกลับnกระทำ ...
harmic

ฉันคิดว่ามีช่องว่างหายไปหลังจาก -r ตัวอย่างเช่น git svn clone -r 1133: HEAD some / svn / repo
Gnana

92

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

# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase

และวิธีที่ดีในการค้นหาว่าสาขาใดที่เริ่มต้นคือการทำsvn logและค้นหาสาขาแรกในสาขา (สาขาสุดท้ายที่ระบุไว้เมื่อทำ):

svn log --stop-on-copy svn://some/repo/branch/some-branch

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


1
+1 จากฉัน - ช่วยฉันได้รับข้อผิดพลาด 128 ปัญหาฉันมีการโคลน repo svn ทั้งหมด
Ian Oxley

คำสั่ง svn log เป็นสิ่งที่ฉันกำลังมองหา! ขอบคุณ
mrbrdo

1
Repos ที่ฉันทำงานด้วยมีการแตกแขนงและเลย์เอาต์ที่ไม่ได้มาตรฐานดังนั้นโดยทั่วไปฉันจะสร้าง repo Git ในพื้นที่สำหรับแต่ละสาขา SVN จากนั้นcherry-pick/ rebaseระหว่างนั้น Commit ใช้ขั้นตอนพิเศษ ( pushจากนั้นdcommitrepo ระยะไกล) แต่ฉันคิดว่ามันคุ้มค่ากับการแลกเปลี่ยน
chronospoon

ไม่เคยคิดมาก่อนเลยว่าจะเร็วแค่โคลนแท็ก / กิ่งก้านที่เฉพาะเจาะจงในขณะที่คุณพูด :)
VeenarM

34

... 7 ปีต่อมาในทะเลทรายพายุหมุนรอบตัว ...

ผมไม่พอใจกับคำตอบที่ได้รับการยอมรับดังนั้นฉันสร้างสคริปต์บางอย่างที่จะทำเช่นนี้สำหรับคุณที่มีอยู่บน Github สิ่งเหล่านี้จะช่วยให้ทุกคนที่ต้องการใช้git svn cloneแต่ไม่ต้องการโคลนพื้นที่เก็บข้อมูลทั้งหมดและไม่ต้องการตามล่าหาการแก้ไขเฉพาะที่จะโคลนจากในช่วงกลางของประวัติศาสตร์ (บางทีคุณอาจจะโคลนกลุ่ม repos) ที่นี่เราสามารถโคลนการแก้ไข N ล่าสุด:

ใช้git svn cloneเพื่อโคลนการปรับปรุง 50 ครั้งล่าสุด

# -u    The SVN URL to clone
# -l    The limit of revisions
# -o    The output directory

./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt

ค้นหาการแก้ไข N ก่อนหน้าจาก repo SVN

# -u    The SVN URL to clone
# -l    The limit of revisions

./svn-lookback.sh -u https://server/project/trunk -l 5     

จะให้สิ่งนี้แตก Repo ของเรามีการปรับปรุงประมาณ 170,000 ครั้งและใช้เวลา waaaay นานเกินไปในการทำโครงการเดียวและฉันมีมากกว่า 10 โครงการที่เฉพาะเจาะจงใน repo ที่ต้องทำ: | พิจารณาเพียงทำประวัติศาสตร์ 3-4 ปีเท่านั้น
VeenarM

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