หากฉันเข้าใจปัญหาของคุณเป็นอย่างดีคุณต้องการสิ่งต่อไปนี้:
- เก็บไฟล์สื่อของคุณไว้ในที่เก็บ git เดียวซึ่งถูกใช้โดยหลายโครงการ
- หากคุณแก้ไขไฟล์มีเดียในโปรเจ็กต์ใด ๆ ในเครื่องของคุณมันควรจะปรากฏขึ้นทันทีในทุกโปรเจ็กต์อื่น (ดังนั้นคุณไม่ต้องการคอมมิชชัน + push + pull ตลอดเวลา)
น่าเสียดายที่ไม่มีวิธีแก้ปัญหาที่ดีที่สุดสำหรับสิ่งที่คุณต้องการ แต่มีบางสิ่งที่คุณสามารถทำให้ชีวิตของคุณง่ายขึ้น
ก่อนอื่นคุณควรตัดสินใจเลือกสิ่งที่สำคัญ: คุณต้องการจัดเก็บสำหรับทุกรุ่นในที่เก็บโครงการของคุณเพื่ออ้างอิงถึงเวอร์ชันของไฟล์มีเดียหรือไม่? ตัวอย่างเช่นถ้าคุณมีโครงการที่ชื่อว่า example.com คุณจำเป็นต้องรู้หรือไม่ว่า style.css ที่ใช้เมื่อ 2 สัปดาห์ที่ผ่านมาหรือล่าสุดหรือที่ล่าสุดคือดีที่สุด
หากคุณไม่จำเป็นต้องรู้วิธีการแก้ปัญหานั้นง่าย:
- สร้างที่เก็บสำหรับไฟล์สื่อและหนึ่งไฟล์สำหรับแต่ละโครงการ
- สร้างลิงก์สัญลักษณ์ในโครงการของคุณซึ่งชี้ไปยังที่เก็บสื่อที่โคลนแบบโลคัล คุณสามารถสร้างลิงก์สัญลักษณ์สัมพัทธ์ (เช่น ../media) และสมมติว่าทุกคนจะชำระเงินโครงการเพื่อให้ไดเรกทอรีสื่ออยู่ในที่เดียวกันหรือเขียนชื่อของลิงก์สัญลักษณ์ลงใน. gitignore และทุกคนสามารถตัดสินใจได้ ตำแหน่งที่เขา / เธอวางไฟล์มีเดีย
อย่างไรก็ตามในกรณีส่วนใหญ่คุณต้องการทราบข้อมูลการกำหนดเวอร์ชันนี้ ในกรณีนี้คุณมีสองทางเลือก:
จัดเก็บทุกโครงการในที่เก็บขนาดใหญ่หนึ่งแห่ง ข้อดีของการแก้ปัญหานี้คือคุณจะมีที่เก็บสื่อเพียง 1 สำเนา ข้อเสียใหญ่คือมันยากมากที่จะสลับระหว่างเวอร์ชันโปรเจ็กต์ (ถ้าคุณเช็กเอาต์เป็นเวอร์ชันอื่นคุณจะแก้ไขโปรเจ็กต์ทั้งหมดเสมอ)
ใช้ submodules (ดังอธิบายในคำตอบ 1) วิธีนี้คุณจะเก็บไฟล์มีเดียไว้ในที่เก็บเดียวและโครงการจะมีเพียงการอ้างอิงถึงเวอร์ชัน repo สื่อเฉพาะ แต่วิธีนี้โดยปกติคุณจะมีสำเนาที่เก็บในเครื่องจำนวนมากและคุณไม่สามารถแก้ไขไฟล์สื่อในโครงการทั้งหมดได้อย่างง่ายดาย
ถ้าฉันเป็นคุณฉันอาจจะเลือกวิธีที่หนึ่งหรือสาม (ลิงก์สัญลักษณ์หรือ submodules) หากคุณเลือกที่จะใช้ submodules คุณยังสามารถทำสิ่งต่าง ๆ มากมายเพื่อทำให้ชีวิตของคุณง่ายขึ้น:
ก่อนที่จะกระทำคุณสามารถเปลี่ยนชื่อไดเรกทอรี submodule และวาง symlink ไว้ในไดเรกทอรีสื่อทั่วไป เมื่อคุณพร้อมที่จะส่งมอบคุณสามารถลบ symlink และลบ submodule กลับมาแล้วคอมมิท
คุณสามารถเพิ่มหนึ่งในสำเนาของที่เก็บสื่อของคุณเป็นที่เก็บระยะไกลในโครงการทั้งหมดของคุณ
คุณสามารถเพิ่มโลคัลไดเร็กทอรีเป็นรีโมตด้วยวิธีนี้:
cd /my/project2/media
git remote add project1 /my/project1/media
หากคุณแก้ไขไฟล์ใน / my / project1 / media คุณสามารถคอมมิทและดึงไฟล์จาก / my / project2 / media โดยไม่ต้องพุชไปที่รีโมตเซิร์ฟเวอร์:
cd /my/project1/media
git commit -a -m "message"
cd /my/project2/media
git pull project1 master
คุณมีอิสระที่จะลบการกระทำเหล่านี้ในภายหลัง (ด้วยการรีเซ็ต git) เพราะคุณไม่ได้แชร์กับผู้ใช้รายอื่น