คุณเพิกเฉยต่อโมดูลย่อย git ใน. gitignore ของคุณหรือผูกมัดกับ repo ของคุณหรือไม่?


94

ฉันได้เพิ่ม submodule กับโครงการของฉันในproject_dir/vendor/submodule_oneตอนนี้ทุกครั้งที่ผมทำงานที่ฉันได้รับgit statusmodified: vendor/submodule_one (new commits)

คำถามของฉันคือวิธีที่ดีที่สุดในการจัดการกับปัญหานี้คืออะไร? ฉันเพิ่มvendor/submodule_one-folder .gitignoreเป็นโปรเจ็กต์หลักของฉันไม่จำเป็นต้องรู้เกี่ยวกับข้อมูลจำเพาะของโมดูลย่อยของฉันหรือไม่

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

เพิ่งเริ่มต้นใช้งานโมดูลย่อยและดูเหมือนจะไม่พบข้อมูลมากไปกว่าการตั้งค่า

คำตอบ:


81

ไม่คุณไม่จำเป็นต้องเพิ่มโมดูลย่อยของคุณ.gitignoreสิ่งที่ผู้ปกครองจะเห็นจากโมดูลย่อยของคุณคือgitlink ( รายการพิเศษmode 160000 )

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

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับนโยบายนั้นได้ใน " git submodule update (true nature of submodules) "
แนวคิดหลักที่อยู่เบื้องหลังโมดูลย่อยคือแนวทางที่อิงตามองค์ประกอบซึ่งคุณอ้างอิง repos อื่น ๆ ในการกระทำที่เฉพาะเจาะจง แต่ถ้าคุณเปลี่ยนแปลงสิ่งใดในโมดูลย่อยเหล่านั้นคุณต้องอัปเดตการอ้างอิงเหล่านั้นใน repo หลักด้วย


โปรดทราบว่าด้วย Git 2.13 (Q2 2017) ในขณะที่ไม่เพิกเฉยต่อ gitlink คุณยังสามารถเพิกเฉยต่อโมดูลย่อยด้วย:

git config submodule.<name>.active false

ดูเพิ่มเติมที่ " ละเว้นการคอมมิตใหม่สำหรับโมดูลย่อย git "


หมายเหตุ: ด้วย Git 2.15.x / 2.16 (Q1 2018) การละเว้นโมดูลย่อยจะแม่นยำกว่า
" git status --ignored --untracked" ไม่ได้หยุดอยู่ที่โครงสร้างการทำงานของโปรเจ็กต์แยกต่างหากที่ฝังอยู่ในไดเร็กทอรีที่ละเว้นและไฟล์ที่แสดงในโปรเจ็กต์อื่นนั้นแทนที่จะแสดงไดเร็กทอรีของตัวเองว่าถูกละเว้น

ดูกระทำ fadb482 (25 ตุลาคม 2017) โดยโยฮันเน Schindelin (dscho )
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ da7996a , 06 พ.ย. 2017)

status: อย่าสับสนกับโมดูลย่อยในไดเร็กทอรีที่ยกเว้น

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

แต่เรายังไม่ได้ปฏิบัติต่อโมดูลย่อยในลักษณะเดียวกัน

ด้วยเหตุนี้git status --ignored --untrackedด้วยโมดูลย่อย submoduleใน gitignored tracked/จะแสดงโมดูลย่อยในส่วน " Untracked files" เช่น

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

แต่เราต้องการให้มันแสดงโมดูลย่อยในส่วน " Ignored files":

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/

1
ขอบคุณ VonC เหมาะสมอย่างยิ่งเมื่อคุณวางแบบนั้น
sprysoft

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

1
ฉันคิดว่าตอนนี้มันสมเหตุสมผลกว่ามากและกำลังให้ข้อมูลเชิงลึกที่เป็นประโยชน์มาก ยอดเยี่ยมขอบคุณสำหรับการอัปเดต :)
SgtPooki

อาร์กิวเมนต์สำหรับ. gitignore: ทำไมต้องเช็คอินไฟล์. gitsubmodules เมื่อ url ที่อยู่ในนั้นอาจมี git url เฉพาะของผู้ใช้ที่มีพารามิเตอร์ชื่อผู้ใช้
djangofan

1
@djangofan คำถาม (และคำตอบของฉัน) เกี่ยวกับการละเว้นโฟลเดอร์โมดูลย่อย(อันที่แสดงโดย gitlink) ไม่เกี่ยวกับการละเว้น.gitmodulesไฟล์ เป็นความจริงที่ว่าไฟล์เดียว (the .gitmodules) นี้อาจมีข้อมูลประจำตัว แต่หากใช้เพียงเพื่อโคลน repos สาธารณะก็ไม่จำเป็นต้องรวมไว้ด้วย นอกจากนี้ยังสามารถแคชได้แม้ใน Windows ด้วยตัวช่วยข้อมูลประจำตัวเช่น "Git Credential Manager for Windows" ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ) ดังนั้นการมีข้อมูลประจำตัว.gitmodulesจึงไม่ถือเป็นการเสียชีวิต
VonC

8

ด้วยเหตุผลบางประการโมดูลย่อยชื่อโมดูลใช้งานไม่ได้สำหรับฉัน

นั่นเป็นเหตุผลที่ฉันใช้submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - ที่นี่คุณจะพบคำอธิบายของค่าพารามิเตอร์ที่เป็นไปได้

ใช้ได้กับฉันสำหรับข้อความ (คอมมิตใหม่) และ (เนื้อหาที่แก้ไข)


1

เพื่อเพิ่มคำตอบที่ยอมรับฉันพบว่าการเพิ่มโฟลเดอร์ Git submodule ไปที่. gitignore ทำให้เกิดปัญหาโดยเฉพาะอย่างยิ่งเมื่อพยายามสร้างโคลนใหม่ของโครงการ โดยเฉพาะอย่างยิ่งการเรียกใช้คำสั่งโคลนโมดูลย่อยปกติส่งผลให้โฟลเดอร์โมดูลย่อยว่างเปล่า:

git submodule init
git submodule update
git pull --recurse-submodules

โดยพยายามเรียกใช้ใหม่เท่านั้น

git submodule add <Git repo> <submodule folder>

เห็นได้ชัดว่าปัญหาคืออะไรขึ้นอยู่กับผลลัพธ์:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

แทนที่จะเพิ่ม-fฉันลบโฟลเดอร์ Git submodule จาก. gitignore และรันคำสั่งโคลนโมดูลย่อยอีกครั้งซึ่งตอนนี้สร้างโฟลเดอร์สำเร็จแล้ว ฉันคิดว่าอาจมีข้อผิดพลาดที่หนึ่งในคำสั่งโคลนโมดูลย่อยตาม. gitignore แต่ไม่ได้เตือนว่ากำลังข้ามโมดูลย่อยตามนั้น

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