git-subtree - ออนไลน์ในคลาวด์

นี่คือคำสั่ง git-subtree ที่สามารถเรียกใช้ในผู้ให้บริการโฮสต์ฟรีของ OnWorks โดยใช้เวิร์กสเตชันออนไลน์ฟรีของเรา เช่น Ubuntu Online, Fedora Online, โปรแกรมจำลองออนไลน์ของ Windows หรือโปรแกรมจำลองออนไลน์ของ MAC OS

โครงการ:

ชื่อ


git-subtree - รวม subtrees เข้าด้วยกันและแยก repository เป็น subtrees

เรื่องย่อ


คอมไพล์ ทรีย่อย เพิ่ม -P
คอมไพล์ ทรีย่อย เพิ่ม -P
คอมไพล์ ทรีย่อย ดึง -P
คอมไพล์ ทรีย่อย ดัน -P
คอมไพล์ ทรีย่อย ผสาน -P
คอมไพล์ ทรีย่อย แยก -P [ตัวเลือก] [ ]

DESCRIPTION


ทรีย่อยอนุญาตให้รวมโปรเจ็กต์ย่อยในไดเร็กทอรีย่อยของโปรเจ็กต์หลัก
รวมถึงประวัติทั้งหมดของโปรเจ็กต์ย่อยด้วย

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

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

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

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

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

คำสั่ง


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

ผสาน
รวมการเปลี่ยนแปลงล่าสุดได้ถึง เข้าไปใน ทรีย่อย ตามปกติ คอมไพล์
ผสานการดำเนินการนี้จะไม่ลบการเปลี่ยนแปลงในเครื่องของคุณ มันก็แค่ผสานการเปลี่ยนแปลงเหล่านั้นเข้าเป็น
ใหม่ล่าสุด . กับ --สควอช, สร้างคอมมิชชันเดียวที่มีทั้งหมด
การเปลี่ยนแปลง แทนที่จะรวมเข้ากับประวัติศาสตร์ทั้งหมด

ถ้าคุณใช้ --สควอชทิศทางการรวมไม่จำเป็นต้องไปข้างหน้าเสมอไป คุณสามารถ
ใช้คำสั่งนี้เพื่อย้อนเวลากลับไปจาก v2.5 ถึง v2.4 เป็นต้น หากการรวมของคุณ
ทำให้เกิดข้อขัดแย้ง คุณสามารถแก้ไขได้ด้วยวิธีปกติ

ดึง
ชอบๆ ผสานแต่มีความคล้ายคลึงกัน คอมไพล์ ดึง ในการที่จะดึงผู้อ้างอิงที่ได้รับจาก
ที่เก็บระยะไกลที่ระบุ

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

แยก
ดึงประวัติโครงการสังเคราะห์ใหม่ออกจากประวัติของ ทรีย่อย NS
ประวัติใหม่รวมเฉพาะคอมมิต (รวมถึงการผสาน) ที่ได้รับผลกระทบ , และ
ภาระผูกพันแต่ละรายการตอนนี้มีเนื้อหาของ ที่ต้นทางของโครงการ
แทนที่จะอยู่ในไดเรกทอรีย่อย ดังนั้นประวัติศาสตร์ที่สร้างขึ้นใหม่จึงเหมาะสำหรับการส่งออก
เป็นที่เก็บ git แยกต่างหาก

หลังจากแยกสำเร็จแล้ว id คอมมิทตัวเดียวจะถูกพิมพ์ไปที่ stdout นี้
สอดคล้องกับ HEAD ของต้นไม้ที่สร้างขึ้นใหม่ ซึ่งคุณสามารถจัดการอย่างไรก็ตาม
ที่คุณต้องการ

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

โปรดทราบว่าถ้าคุณใช้ --สควอช เมื่อคุณรวม คุณมักจะไม่เพียงแค่ -- เข้าร่วมใหม่
เมื่อคุณแยก

OPTIONS


-q, --เงียบ
ระงับข้อความส่งออกที่ไม่จำเป็นบน stderr

-d, --debug
สร้างข้อความเอาต์พุตที่ไม่จำเป็นเพิ่มเติมบน stderr

-NS , --prefix=
ระบุพาธในที่เก็บไปยังทรีย่อยที่คุณต้องการจัดการ ตัวเลือกนี้
เป็นคำสั่งบังคับสำหรับคำสั่งทั้งหมด

-NS , --ข้อความ=
ตัวเลือกนี้ใช้ได้เฉพาะกับการเพิ่ม ผสาน และดึง (ไม่แน่ใจ) ระบุ เป็น
คอมมิตข้อความสำหรับการคอมมิตการรวม

OPTIONS สำหรับ เพิ่ม, ผสาน, ดัน, ดึง


--สควอช
ตัวเลือกนี้ใช้ได้กับคำสั่งเพิ่ม ผสาน และดึงเท่านั้น

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

การใช้ตัวเลือกนี้ช่วยลดความยุ่งเหยิงของบันทึก คนไม่ค่อยอยากเห็นทุกความเปลี่ยนแปลง
ที่เกิดขึ้นระหว่าง v1.0 และ v1.1 ของไลบรารีที่พวกเขาใช้อยู่ เนื่องจากไม่มี
เวอร์ชันชั่วคราวเคยรวมอยู่ในแอปพลิเคชันของพวกเขา

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

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

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

OPTIONS สำหรับ แยก


--หมายเหตุ=
ตัวเลือกนี้ใช้ได้เฉพาะกับคำสั่ง split

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

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

-NS , --สาขา=
ตัวเลือกนี้ใช้ได้เฉพาะกับคำสั่ง split

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

--ignore-เข้าร่วม
ตัวเลือกนี้ใช้ได้เฉพาะกับคำสั่ง split

ถ้าคุณใช้ -- เข้าร่วมใหม่, ทรีย่อยของ git พยายามเพิ่มประสิทธิภาพการสร้างประวัติใหม่เป็น
สร้างเฉพาะการคอมมิตใหม่ตั้งแต่ครั้งล่าสุด -- เข้าร่วมใหม่. --ignore-เข้าร่วม ปิดการใช้งานนี้
พฤติกรรมบังคับให้สร้างประวัติศาสตร์ใหม่ทั้งหมด ในโครงการขนาดใหญ่ กระป๋องนี้
ใช้เวลานาน.

--onto=
ตัวเลือกนี้ใช้ได้เฉพาะกับคำสั่ง split

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

ถ้าคุณใช้ คอมไพล์ ทรีย่อย เพิ่มคุณไม่ควรต้องการตัวเลือกนี้

-- เข้าร่วมใหม่
ตัวเลือกนี้ใช้ได้เฉพาะกับคำสั่ง split

หลังจากแยกแล้ว ให้รวมประวัติสังเคราะห์ที่สร้างขึ้นใหม่กลับเข้าไปใน main . ของคุณ
โครงการ. ด้วยวิธีนี้ การแยกย่อยในอนาคตสามารถค้นหาได้เฉพาะส่วนหนึ่งของประวัติศาสตร์ที่ผ่านไปแล้ว
เพิ่มตั้งแต่ล่าสุด --rejoin

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

ขออภัย การใช้ตัวเลือกนี้ส่งผลให้ คอมไพล์ เข้าสู่ระบบ แสดงสำเนาพิเศษของใหม่ทุกรายการ
คอมมิชชันที่สร้างขึ้น (ต้นฉบับและแบบสังเคราะห์)

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

ตัวอย่าง 1. เพิ่ม คำสั่ง


สมมติว่าคุณมีที่เก็บในเครื่องที่คุณต้องการเพิ่มภายนอก
ห้องสมุดผู้ขายที่. ในกรณีนี้ เราจะเพิ่มที่เก็บ git-subtree เป็นไดเร็กทอรีย่อย
ของที่เก็บ git-extensions ที่มีอยู่แล้วของคุณใน ~/git-นามสกุล/:

$ git subtree add --prefix=git-subtree --squash
git://github.com/apenwarr/git-subtree.git ต้นแบบ

เจ้านาย จะต้องเป็นผู้อ้างอิงระยะไกลที่ถูกต้องและสามารถเป็นชื่อสาขาอื่นได้

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

ตอนนี้เรามี ~/git-extensions/git-subtree ไดเร็กทอรีที่มีรหัสจาก master
สาขาของ git://github.com/apenwarr/git-subtree.git ในที่เก็บ git-extensions ของเรา

ตัวอย่าง 2. สารสกัดจาก A ซับทรี ใช้ ให้สัญญา, ผสาน AND ดึง


ลองใช้ที่เก็บสำหรับซอร์สโค้ด git เป็นตัวอย่าง ขั้นแรก รับสำเนาของคุณเอง
ของที่เก็บ git.git:

$ git โคลน git://git.kernel.org/pub/scm/git/git.git test-git
$ cd ทดสอบคอมไพล์

gitweb (commit 1130ef3) ถูกรวมเข้ากับ git เมื่อกระทำ 0a8f4f0 หลังจากนั้นก็ไม่มี
บำรุงรักษาแยกต่างหากอีกต่อไป แต่ลองนึกภาพว่ามันได้รับการดูแลแยกต่างหาก และเราต้องการ
เพื่อแยกการเปลี่ยนแปลงของ git ใน gitweb ตั้งแต่เวลานั้น เพื่อแบ่งปันกับต้นน้ำ คุณสามารถ
ทำเช่นนี้:

$ git subtree split --prefix=gitweb --annotate='(split) '
0a8f4f0^.. --onto=1130ef3 --rejoin
--สาขา gitweb-ล่าสุด
$ gitk gitweb-ล่าสุด
$ คอมไพล์กด git@github.com:whatever/gitweb.git gitweb-latest:master

(เราใช้ 0a8f4f0^.. เพราะนั่นหมายถึง "การเปลี่ยนแปลงทั้งหมดจาก 0a8f4f0 เป็นปัจจุบัน
เวอร์ชัน รวมถึง 0a8f4f0 เองด้วย")

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

$ git subtree split --prefix=gitweb --annotate='(split) ' --rejoin
--สาขา gitweb-latest2

และคุณสามารถรวมการเปลี่ยนแปลงกลับเข้าจากโปรเจ็กต์ต้นน้ำได้อย่างง่ายดายเช่นกัน:

$ git subtree pull --prefix=gitweb
git@github.com:whatever/gitweb.git มาสเตอร์

หรือใช้ --สควอชคุณสามารถย้อนกลับไปยัง gitweb เวอร์ชันก่อนหน้าได้จริง:

$ git การรวมทรีย่อย --prefix=gitweb --squash gitweb-latest~10

จากนั้นทำการเปลี่ยนแปลงบางอย่าง:

$ date >gitweb/myfile
$ git เพิ่ม gitweb/myfile
$ git commit -m 'สร้าง myfile แล้ว'

และกรอไปข้างหน้าอีกครั้ง:

$ git การรวมทรีย่อย --prefix=gitweb --squash gitweb-latest

และสังเกตว่าการเปลี่ยนแปลงของคุณยังคงไม่บุบสลาย:

$ ls -l gitweb/myfile

และคุณสามารถแยกออกและดูการเปลี่ยนแปลงของคุณเทียบกับ gitweb มาตรฐาน:

git log gitweb-latest..$(git subtree split --prefix=gitweb)

ตัวอย่าง 3. สารสกัดจาก A ซับทรี ใช้ สาขา


สมมติว่าคุณมีไดเร็กทอรีต้นทางที่มีไฟล์และไดเร็กทอรีย่อยจำนวนมาก และคุณต้องการ
แยกไดเร็กทอรี lib ไปยังโปรเจ็กต์ git ของตัวเอง นี่เป็นวิธีสั้นๆ ในการทำ:

ขั้นแรก สร้างที่เก็บใหม่ทุกที่ที่คุณต้องการ:

$
$ git init -- เปล่า

กลับไปที่ไดเร็กทอรีเดิมของคุณ:

$ git subtree split --prefix=lib --annotate="(split)" -b split

จากนั้นผลักสาขาใหม่ไปยังที่เก็บว่างใหม่:

$ git push split:master

ใช้ git-subtree ออนไลน์โดยใช้บริการ onworks.net



โปรแกรมออนไลน์ Linux และ Windows ล่าสุด