โซลูชันโดยละเอียด
ดูหมายเหตุท้ายคำตอบนี้ (ย่อหน้าสุดท้าย) สำหรับทางเลือกที่รวดเร็วสำหรับ git submodules โดยใช้ npm;)
ในคำตอบต่อไปนี้คุณจะรู้วิธีแยกโฟลเดอร์จากที่เก็บและสร้างที่เก็บ git จากนั้นรวมเป็นโมดูลย่อยแทนที่จะเป็นโฟลเดอร์
แรงบันดาลใจจากบทความของ Gerg Bayer การย้ายไฟล์จากที่เก็บ Git หนึ่งไปยังอีกที่เก็บรักษาประวัติศาสตร์
ในตอนแรกเรามีสิ่งนี้:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
ในขั้นตอนการร้องผมจะอ้างนี้เป็นsomeLib
<directory 1>
ในตอนท้ายเราจะมีสิ่งนี้:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
สร้างที่เก็บ git ใหม่จากโฟลเดอร์ในที่เก็บอื่น
ขั้นตอนที่ 1
รับสำเนาใหม่ของที่เก็บเพื่อแยก
git clone <git repository A url>
cd <git repository A directory>
ขั้นตอนที่ 2
โฟลเดอร์ปัจจุบันจะเป็นที่เก็บใหม่ดังนั้นให้ลบรีโมตปัจจุบันออก
git remote rm origin
ขั้นตอนที่ 3
แยกประวัติของโฟลเดอร์ที่ต้องการและยืนยัน
git filter-branch --subdirectory-filter <directory 1> -- --all
ตอนนี้คุณควรมีที่เก็บ git พร้อมไฟล์จากdirectory 1
ในรูทที่เก็บของคุณพร้อมประวัติคอมมิตที่เกี่ยวข้องทั้งหมด
ขั้นตอนที่ 4
สร้างที่เก็บออนไลน์ของคุณและผลักดันที่เก็บใหม่ของคุณ!
git remote add origin <git repository B url>
git push
คุณอาจต้องกำหนดupstream
สาขาสำหรับการผลักดันครั้งแรกของคุณ
git push --set-upstream origin master
ทำความสะอาด<git repository A>
(ไม่จำเป็นดูความคิดเห็น)
เราต้องการลบการติดตาม (ไฟล์และประวัติการกระทำ) <git repository B>
จาก<git repository A>
ดังนั้นประวัติสำหรับโฟลเดอร์นี้จึงมีเพียงครั้งเดียว
โดยอ้างอิงจากการลบข้อมูลที่ละเอียดอ่อนออกจาก github
ไปที่โฟลเดอร์ใหม่และ
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
แทนที่<directory 1>
ด้วยโฟลเดอร์ที่คุณต้องการลบ -r
จะทำซ้ำภายในไดเร็กทอรีที่ระบุ :) ตอนนี้ดันไปorigin/master
ด้วย--force
git push origin master --force
ด่านบอส (ดูหมายเหตุด้านล่าง)
สร้างโมดูลย่อยจาก<git repository B>
เข้า<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
ตรวจสอบว่าทุกอย่างทำงานตามที่คาดไว้หรือไม่ push
git push origin master
บันทึก
หลังจากทำทั้งหมดนี้แล้วฉันก็ตระหนักในกรณีของฉันว่าการใช้npmเพื่อจัดการการอ้างอิงของฉันเองนั้นเหมาะสมกว่าแทน เราสามารถระบุ URL คอมไพล์และรุ่นให้ดูที่URL ที่ package.json คอมไพล์เป็นการอ้างอิง
ถ้าคุณทำมันด้วยวิธีนี้พื้นที่เก็บข้อมูลที่คุณต้องการที่จะใช้เป็นความต้องการต้องเป็นโมดูล NPMดังนั้นจึงต้องมีไฟล์หรือคุณจะได้รับข้อผิดพลาดนี้:package.json
Error: ENOENT, open 'tmp.tgz-unpack/package.json'
tldr (ทางเลือกอื่น)
คุณอาจพบว่าการใช้npmง่ายขึ้นและจัดการการอ้างอิงด้วย git urls :
- ย้ายโฟลเดอร์ไปยังที่เก็บใหม่
- ทำงาน
npm init
ภายในที่เก็บทั้งสอง
- เรียกใช้ใน
npm install --save git://github.com/user/project.git#commit-ish
ตำแหน่งที่คุณต้องการติดตั้งการอ้างอิง