ฉันจะย้ายโฟลเดอร์เดียวจากที่เก็บ Subversion หนึ่งไปยังที่เก็บอื่นได้อย่างไร


156

ฉันมีโฟลเดอร์ "เอกสาร" ในที่เก็บข้อมูลการโค่นล้มชื่อ "โครงการ" ฉันได้ข้อสรุปว่าควรเก็บไว้ภายใต้พื้นที่เก็บข้อมูลการโค่นล้มแยกต่างหากชื่อ "project_docs"

ฉันต้องการย้ายโฟลเดอร์ "เอกสาร" ( และการแก้ไขทั้งหมด ) ไปยังพื้นที่เก็บข้อมูล "project_docs" มีวิธีทำเช่นนี้หรือไม่?

คำตอบ:


183

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

จะเป็นเช่นนี้:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

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


1
ตัวอย่างที่ดี โปรดทราบว่าตามที่ระบุไว้ในเอกสารที่ฉันเชื่อมโยงไปด้วยวิธีนี้จะแก้ไขหมายเลขการแก้ไขทั้งหมดอีกครั้งเพื่อให้ไม่มี "เปล่า" สิ่งที่ควรทราบหากคุณอ้างอิงการแก้ไขเอกสารที่อื่น
Adam Bellaire

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

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

6
การเรียงลำดับการแก้ไขอาจเป็นความคิดที่ไม่ดีเป็นกระทำข้อความและเครื่องมือติดตามปัญหาที่อาจจะหมายถึงพวกเขา
Wim Coenen

5
สิ่งนี้ใช้ได้สำหรับฉัน ฉันเป็นผู้ใช้ windows (Visual SVN Server) และคำสั่งแรกของฉันดูเหมือนว่านี้ถ้ามันช่วยทุกคน:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris

30

svndumpfilter มีข้อบกพร่องร้ายแรง - หากไฟล์หรือเส้นทางถูกคัดลอกจากพา ธ ที่คุณกรองไปยังไฟล์ที่คุณกำลังกรอง svndumpfilter จะไม่สามารถกรอกประวัติและงานจะล้มเหลว

คุณสามารถใช้svndumpfilter2หากคุณประสบปัญหานี้


4
นี่คือลิงค์ที่ดีกว่าสำหรับ svndumpfilter2: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin

ในกรณีนี้คุณสามารถเพิ่มเส้นทางที่จำเป็นไปยังรายการ ... ที่เฉพาะเจาะจงที่สุดเท่าที่จะทำได้ ... จากนั้นนำรายการเหล่านั้นออกจากโครงการหลังจากนำเข้า
James Gawron

6

สิ่งนี้ถูกกล่าวถึงในเอกสาร SVN ตรวจสอบส่วนการบำรุงรักษา Repositoryบนsvndumpfilter... มันอธิบายถึงวิธีการถ่ายโอนข้อมูลโครงการออกจากพื้นที่เก็บข้อมูลส่วนกลางและย้ายไปยังที่เก็บใหม่แยกต่างหาก


2

ฉันไม่เชื่อว่าคุณสามารถทำได้จากระยะไกล (เช่นไม่มีสำเนาในเครื่อง) แต่สิ่งนี้ควรใช้งานได้: svn exportโฟลเดอร์จากเซิร์ฟเวอร์ดั้งเดิมจากนั้นsvn addไปยัง repo ใหม่ของคุณ

ชอบ:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

แก้ไข: D'oh นี่เป็นการลดลงของประวัติศาสตร์ ใช้svnadminเป็นซามูเอลอธิบาย


3
อย่างไรก็ตามคุณไม่สามารถแก้ไขได้โดยไม่ต้องเข้าถึงที่เก็บข้อมูลเอง หากคุณสามารถมีสำเนาที่ใช้งานได้เท่านั้นนี่คือสิ่งที่ดีที่สุดที่เขาสามารถทำได้
ซามูเอล

2

สำหรับการอ้างอิงในอนาคต:

เอกสาร SVN รายงานอย่างชัดเจน:

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

ใช้ sed หรือ Vim เพื่อแทนที่ไดเรกทอรีระดับบนสุด แต่ชื่อไดเรกทอรีนี้มีอยู่ในไฟล์โครงการ !!!! สิ่งนี้ทำให้เกิดข้อผิดพลาดในการตรวจสอบโหลด SVN

ดังนั้นเมื่อคุณทำการดำเนินการนี้อย่าทำการแทนที่สตริงด้วย sed ของชื่อพา ธ เท่านั้น

ทดแทน“ Node-path: old_path” ด้วย“ Node-path: new_path” ดูรายละเอียดเพิ่มเติมในบทที่ SVN หนังสือบทที่ 5“ การบริหารพื้นที่เก็บข้อมูล”


1

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

ดังนั้นฉันส่งออกเฉพาะรุ่นที่มีการเปลี่ยนแปลงไดเรกทอรีของฉัน (อาจไม่ทำงานหากไดเรกทอรีที่คุณต้องการส่งออกมีการอ้างอิงไปยังสถานที่อื่น ๆ ใน repo ของคุณ)

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

คุณต้องแทนที่ repo URL ( URL_to_docs), ตำแหน่งในเซิร์ฟเวอร์ ( /svn/old_repo) และพา ธ ไปยังเอกสารในที่เก็บ ( path/to/docs)

คุณสามารถแก้ไขได้อย่างง่ายดายdocs_only.dumpหากคุณต้องการเปลี่ยนตำแหน่งของไดเรกทอรีเอกสารในที่เก็บใหม่ของคุณ

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