โชคดีสำหรับพวกเราที่ยังคงถูกบังคับให้ใช้ CVS คอมไพล์มีเครื่องมือที่ดีมากในการทำสิ่งที่คุณต้องการทำ ข้อเสนอแนะของฉัน (และสิ่งที่เราทำที่ $ work):
การสร้างโคลนเริ่มต้น
ใช้git cvsimport
เพื่อโคลนประวัติการแก้ไข CVS ลงในที่เก็บ git ฉันใช้คำขอร้องต่อไปนี้:
% git cvsimport -d $CVSROOT -C dir_to_create -r cvs -k \
-A /path/to/authors/file cvs_module_to_checkout
-A
ตัวเลือกที่จะเป็นตัวเลือก แต่มันจะช่วยให้ประวัติการแก้ไขของคุณที่นำเข้าจาก CVS มีลักษณะเหมือนคอมไพล์ (ดูman git-cvsimport
ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการนี้มีการตั้งค่า)
ขึ้นอยู่กับขนาดและประวัติของที่เก็บ CVS การนำเข้าครั้งแรกนี้จะใช้เวลานานมาก คุณสามารถเพิ่ม a -v ลงในคำสั่งด้านบนได้หากคุณต้องการความสบายใจว่ามีบางอย่างเกิดขึ้นจริง
เมื่อกระบวนการนี้เสร็จสิ้นคุณจะมีmaster
สาขาที่ควรสะท้อนถึง HEAD ของ CVS ( git cvsimport
โดยค่าเริ่มต้นจะละเว้นค่าคอมมิต 10 นาทีสุดท้ายเพื่อหลีกเลี่ยงการจับคอมมิตที่เสร็จไปแล้วครึ่งหนึ่ง) จากนั้นคุณสามารถใช้git log
และเพื่อน ๆ เพื่อตรวจสอบประวัติทั้งหมดของที่เก็บได้เหมือนกับว่าเคยใช้คอมไพล์มาตั้งแต่ต้น
การปรับแต่งการกำหนดค่า
มีการปรับแต่งการกำหนดค่าบางอย่างที่จะทำให้การนำเข้าเพิ่มเติมจาก CVS (เช่นเดียวกับการส่งออก) ง่ายขึ้นในอนาคต สิ่งเหล่านี้ไม่ได้บันทึกไว้ในgit cvsimport
man page ดังนั้นฉันคิดว่าพวกเขาสามารถเปลี่ยนแปลงได้โดยไม่ต้องแจ้งให้ทราบล่วงหน้า แต่ FWIW:
% git config cvsimport.module cvs_module_to_checkout
% git config cvsimport.r cvs
% git config cvsimport.d $CVSROOT
ตัวเลือกทั้งหมดนี้สามารถระบุได้ในบรรทัดคำสั่งเพื่อให้คุณข้ามขั้นตอนนี้ได้อย่างปลอดภัย
การนำเข้าที่เพิ่มขึ้น
ครั้งต่อ ๆ ไปgit cvsimport
ควรเร็วกว่าการเรียกครั้งแรกมาก อย่างไรก็ตามทำcvs rlog
ในทุกไดเร็กทอรี (แม้กระทั่งที่มีเฉพาะไฟล์ในAttic
) ดังนั้นจึงอาจใช้เวลาสักครู่ หากคุณได้ระบุการกำหนดค่าที่แนะนำไว้ข้างต้นสิ่งที่คุณต้องทำคือดำเนินการ:
% git cvsimport
หากคุณไม่ได้ตั้งค่าคอนฟิกของคุณเพื่อระบุค่าเริ่มต้นคุณจะต้องระบุในบรรทัดคำสั่ง:
% git cvsimport -r cvs -d $CVSROOT cvs_module_to_checkout
ไม่ว่าจะด้วยวิธีใดสองสิ่งที่ควรคำนึงถึง:
- ตรวจสอบให้แน่ใจว่าคุณอยู่ในไดเร็กทอรีรูทของที่เก็บ git ของคุณ หากคุณอยู่ที่อื่นก็จะพยายามทำใหม่
cvsimport
ที่จะใช้เวลาตลอดไป
- ตรวจสอบให้แน่ใจว่าคุณอยู่ใน
master
สาขาของคุณเพื่อให้สามารถรวมการเปลี่ยนแปลง (หรือเปลี่ยนฐาน) เป็นสาขาในพื้นที่ / หัวข้อของคุณได้
การเปลี่ยนแปลงในท้องถิ่น
ในทางปฏิบัติฉันขอแนะนำให้ทำการเปลี่ยนแปลงในสาขาเสมอและรวมเฉพาะmaster
เมื่อคุณพร้อมที่จะส่งออกการเปลี่ยนแปลงเหล่านั้นกลับไปยังที่เก็บ CVS คุณสามารถใช้เวิร์กโฟลว์ใดก็ได้ที่คุณต้องการในสาขาของคุณ (การรวมการทำซ้ำการบีบ ฯลฯ ) แต่แน่นอนว่าจะมีการใช้กฎการปรับซ้ำมาตรฐาน: อย่าตั้งฐานใหม่หากมีคนอื่นมาพิจารณาการเปลี่ยนแปลงในสาขาของคุณ
การส่งออกการเปลี่ยนแปลงเป็น CVS
git cvsexportcommit
คำสั่งช่วยให้คุณสามารถส่งออกเพียงครั้งเดียวกระทำออกไปยังเซิร์ฟเวอร์ที่ CVS คุณสามารถระบุรหัสคอมมิตเดียว (หรืออะไรก็ได้ที่อธิบายคอมมิตเฉพาะตามที่กำหนดไว้man git-rev-parse
) จากนั้นสร้างความแตกต่างนำไปใช้กับการชำระเงิน CVS จากนั้น (เป็นทางเลือก) ที่มุ่งมั่นกับ CVS โดยใช้cvs
ไคลเอ็นต์จริง คุณสามารถเอ็กซ์พอร์ตไมโครคอมมิตแต่ละอันในสาขาหัวข้อของคุณได้ แต่โดยทั่วไปฉันต้องการสร้างคอมมิตการผสานให้เป็นปัจจุบันmaster
และส่งออกคอมมิตเดียวนั้นไปยัง CVS เมื่อคุณเอ็กซ์พอร์ตคอมมิตการผสานคุณต้องบอกคอมมิตที่คอมมิตพาเรนต์ที่จะใช้สร้างความแตกต่าง นอกจากนี้จะใช้ไม่ได้หากการผสานของคุณเป็นการกรอไปข้างหน้า (ดูส่วน "วิธีผสานการทำงาน" ของman git-merge
คำอธิบายของการผสานกรอไปข้างหน้า) ดังนั้นคุณต้องใช้--no-ff
ตัวเลือกเมื่อทำการผสาน นี่คือตัวอย่าง:
# on master
% git merge --no-ff --log -m "Optional commit message here" topic/branch/name
% git cvsexportcommit -w /path/to/cvs/checkout -u -p -c ORIG_HEAD HEAD
คุณสามารถมองเห็นสิ่งที่แต่ละตัวเลือกเหล่านั้นหมายถึงบนหน้าคนสำหรับ Git-cvsexportcommit คุณมีตัวเลือกในการตั้งค่า-w
ตัวเลือกในการกำหนดค่าคอมไพล์ของคุณ:
% git config cvsexportcommit.cvsdir /path/to/cvs/checkout
หากแพตช์ล้มเหลวไม่ว่าด้วยเหตุผลใดก็ตามประสบการณ์ของฉันก็คือคุณ (น่าเสียดาย) อาจจะดีกว่าในการคัดลอกไฟล์ที่เปลี่ยนแปลงด้วยตนเองและดำเนินการโดยใช้ไคลเอนต์ cvs อย่างไรก็ตามสิ่งนี้ไม่ควรเกิดขึ้นหากคุณตรวจสอบให้แน่ใจว่าmaster
CVS เป็นปัจจุบันก่อนที่จะรวมสาขาหัวข้อของคุณเข้า
หากการคอมมิตล้มเหลวไม่ว่าด้วยเหตุผลใดก็ตาม (ปัญหาเครือข่าย / สิทธิ์ ฯลฯ ) คุณสามารถนำคำสั่งที่พิมพ์ไปยังเทอร์มินัลของคุณในตอนท้ายของผลลัพธ์ข้อผิดพลาดและดำเนินการในไดเร็กทอรีการทำงาน CVS ของคุณ โดยปกติจะมีลักษณะดังนี้:
% cvs commit -F .msg file1 file2 file3 etc
ในครั้งต่อไปที่คุณทำgit cvsimport
(รออย่างน้อย 10 นาที) คุณจะเห็นแพตช์ของคอมมิตที่ส่งออกของคุณนำเข้าอีกครั้งในที่เก็บในเครื่องของคุณ พวกเขาจะมีรหัสคอมมิตที่แตกต่างกันเนื่องจากการคอมมิต CVS จะมีการประทับเวลาที่แตกต่างกันและอาจเป็นชื่อคอมมิทเตอร์ที่แตกต่างกัน (ขึ้นอยู่กับว่าคุณตั้งค่าไฟล์ผู้เขียนในชื่อย่อของคุณcvsimport
ด้านบนหรือไม่)
การโคลน CVS ของคุณ
หากคุณมีมากกว่าหนึ่งคนที่ต้องการทำสิ่งcvsimport
นี้จะมีประสิทธิภาพมากกว่าที่จะมีที่เก็บ git เดียวที่ดำเนินการ cvsimport และมีที่เก็บอื่น ๆ ทั้งหมดที่สร้างเป็นโคลน สิ่งนี้ใช้งานได้อย่างสมบูรณ์และที่เก็บโคลนสามารถดำเนินการ cvsexportcommits ได้ตามที่อธิบายไว้ข้างต้น อย่างไรก็ตามมีข้อแม้อย่างหนึ่ง เนื่องจากวิธีที่ CVS คอมมิตกลับมาพร้อมกับรหัสการคอมมิตที่แตกต่างกัน (ตามที่อธิบายไว้ข้างต้น) คุณไม่ต้องการให้สาขาที่โคลนของคุณติดตามที่เก็บ git ส่วนกลาง ตามค่าเริ่มต้นนี่คือวิธีgit clone
กำหนดค่าที่เก็บของคุณ แต่สามารถแก้ไขได้ง่าย:
% git clone [CENTRAL_REPO_HERE]
% cd [NEW_GIT_REPO_DIR_HERE]
% git config --unset branch.master.remote
% git config --unset branch.master.merge
หลังจากที่คุณลบการกำหนดค่าเหล่านี้แล้วคุณจะต้องพูดอย่างชัดเจนว่าจะดึงจากที่ไหนและอะไรเมื่อคุณต้องการดึงคอมมิตใหม่จากที่เก็บส่วนกลาง:
% git pull origin master
โดยรวมแล้วฉันพบว่าขั้นตอนการทำงานนี้สามารถจัดการได้ค่อนข้างดีและ "สิ่งที่ดีที่สุดถัดไป" เมื่อการย้ายข้อมูลไปยังคอมไพล์ทั้งหมดนั้นไม่สามารถใช้ได้จริง