Git diff บอกว่าโครงการย่อยสกปรก


227

ฉันเพิ่งจะเรียกใช้คอมไพล์และฉันได้รับผลลัพธ์ต่อไปนี้สำหรับทั้งหมด 10 submodules ของฉัน

diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty

สิ่งนี้หมายความว่า? ฉันจะแก้ไขได้อย่างไร

คำตอบ:


268

ตามที่ระบุไว้ในบล็อกโพสต์มาร์ค Longair ของGit submodules อธิบาย ,

รุ่น 1.7.0 และใหม่กว่าของ git มีการเปลี่ยนแปลงที่น่ารำคาญในพฤติกรรมของ submodule git
ตอนนี้ Submodules ถูกมองว่าสกปรกหากมีไฟล์ที่แก้ไขหรือไฟล์ที่ไม่ได้ติดตามซึ่งก่อนหน้านี้มันจะเป็นเพียงกรณีที่ HEAD ใน submodule ชี้ไปที่การกระทำผิด

ความหมายของเครื่องหมายบวก ( +) ในผลลัพธ์ของ submodule git มีการเปลี่ยนแปลงและเป็นครั้งแรกที่คุณเจอสิ่งนี้จะใช้เวลาสักครู่ในการคิดว่าเกิดอะไรขึ้นเช่นดูจาก changelogs หรือใช้ git bisect บน git .git เพื่อค้นหาการเปลี่ยนแปลง ผู้ใช้จะแนะนำสัญลักษณ์ที่แตกต่างกันสำหรับ“ ในเวอร์ชั่นที่ระบุ แต่สกปรก”

คุณสามารถแก้ไขได้โดย:

  • ไม่ว่าจะกระทำหรือเลิกทำการเปลี่ยนแปลง / วิวัฒนาการในแต่ละ submodules ของคุณก่อนที่จะกลับไปที่ repo หลัก (ที่ diff ไม่ควรรายงานไฟล์ "สกปรก" อีกต่อไป) หากต้องการยกเลิกการเปลี่ยนแปลงทั้งหมดของ submodule ของคุณเพียงแค่cdเข้าไปในไดเรกทอรีรากของ submodule ของคุณและทำgit checkout .

    ความคิดเห็นdotnetCarpenterที่คุณสามารถทำได้:git submodule foreach --recursive git checkout .

  • หรือเพิ่ม--ignore-submodulesในของคุณgit diffเพื่อเพิกเฉยต่อรายการย่อย "สกปรก" เหล่านั้นชั่วคราว

ใหม่ใน Git เวอร์ชั่น 1.7.2

ในฐานะที่เป็นโนม ความคิดเห็นด้านล่าง , คำถามนี้กล่าวว่าตั้งแต่รุ่นคอมไพล์ 1.7.2 คุณสามารถละเลย submodules สกปรกด้วย:

git status --ignore-submodules=dirty

2
สิ่งที่ควรรู้: คุณยังคงสามารถดำเนินการได้git commit -aโดยไม่ต้องกังวลกับการเพิ่มการเปลี่ยนแปลงเหล่านี้ แม้ว่าพวกเขากำลังทำเครื่องหมายไว้Mข้างหน้า แต่พวกเขาจะไม่จบลงด้วยความมุ่งมั่นของคุณ
gitaarik

1
สำหรับผมแล้วผมต้องไปลงในแต่ละ submodule git clean -idสกปรกและวิ่ง
GDP2

1
@ GDP2 ซึ่งคุณสามารถสวมใส่ในหนึ่งบรรทัดด้วยgit submodule foreach --recursive git clean -id(เพื่อทดสอบใน repo สำรองก่อน))
VonC

1
กรณีที่ผมเก็บไว้ที่เห็นนี้ลึกลับสิ่งที่เกิดขึ้นคือการที่ฉันมีไฟล์ที่ไม่ได้ติดตามที่ไม่ได้อยู่ใน .gitignoresubmodule การเพิ่มสิ่งเหล่านั้นลงในรายการความสนใจแบบโกลบอลของฉัน
Ben

21

นอกจากนี้การลบ submodule และจากนั้นเรียกใช้git submodule initและgit submodule updateเห็นได้ชัดว่าจะทำเคล็ดลับ แต่อาจไม่เหมาะสมหรือเป็นไปได้เสมอ


1
สิ่งนี้ใช้ได้สำหรับฉันเมื่อฉันแปลงโฟลเดอร์ที่มีอยู่บางส่วนเป็น submodules แล้วดึงไปยังเครื่องอื่นซึ่งยังคงมีโฟลเดอร์เก่าอยู่
Roger Lipscombe

18

ในการเพิกเฉยไฟล์ที่ไม่ได้ติดตามทั้งหมดใน submodule ใด ๆ ให้ใช้คำสั่งต่อไปนี้เพื่อเพิกเฉยต่อการเปลี่ยนแปลงเหล่านั้น

git config --global diff.ignoreSubmodules dirty

มันจะเพิ่มตัวเลือกการกำหนดค่าต่อไปนี้ให้กับการตั้งค่า git ท้องถิ่นของคุณ:

[diff]
  ignoreSubmodules = dirty

ข้อมูลเพิ่มเติมสามารถดูได้ที่นี่


16

แก้ไข : คำตอบนี้ (และส่วนใหญ่อื่น ๆ ) ล้าสมัย; ดูคำตอบ Devpool แทน


แต่เดิมไม่มีตัวเลือกการกำหนดค่าที่จะทำให้ " git diff --ignore-submodules" และ " git status --ignore-submodules" เป็นค่าเริ่มต้นทั่วไป (แต่ดูการตั้งค่าสถานะเริ่มต้น git บนคำสั่ง ) อีกทางเลือกหนึ่งคือการตั้งค่าignoreตัวเลือกการกำหนดค่าเริ่มต้นสำหรับแต่ละ submodule ที่คุณต้องการละเว้น (ทั้งคู่git diffและgit status) ไม่ว่าจะเป็นใน.git/configไฟล์ (ในเครื่องเท่านั้น) หรือ.gitmodules(จะเป็นเวอร์ชั่นโดย git) ตัวอย่างเช่น:

[submodule "foobar"]
    url = git@bitbucket.org:foo/bar.git
    ignore = untracked

ignore = untrackedเพื่อเพิกเฉยต่อไฟล์ที่ไม่ได้ติดตามignore = dirtyการเพิกเฉยกับไฟล์ที่ถูกแก้ไขและignore = allไม่สนใจก็กระทำเช่นกัน เห็นได้ชัดว่าไม่มีวิธีการแทนที่สำหรับทุก submodules


13

เป็นกรณีนี้เนื่องจากตัวชี้ที่คุณมีสำหรับ submodule ไม่ใช่สิ่งที่เกิดขึ้นจริงในไดเรกทอรี submodule ในการแก้ไขปัญหานี้คุณต้องเรียกใช้git submodule updateอีกครั้ง:


9
git submodule foreach --recursive git checkout .

นี่ไม่ใช่เคล็ดลับสำหรับฉัน แต่มันทำให้ฉันมีรายชื่อไฟล์ (ในกรณีของฉันมีเพียงไฟล์เดียว) ที่มีการเปลี่ยนแปลงใน submodule (โดยที่ฉันไม่ต้องทำอะไรที่นั่น)

ดังนั้นฉันสามารถตรงไปที่สถานะ submodule และ git แสดงให้ฉันเห็นว่า HEAD ของฉันถูกถอด -> git หลักของการชำระเงินสถานะ git เพื่อดูไฟล์ที่แก้ไขอีกครั้ง git checkout> ชื่อไฟล์ <ดึง git และทุกอย่างดีอีกครั้ง


9

ฉันสิ้นสุดการลบไดเรกทอรี submodule และเริ่มต้นอีกครั้ง

cd my-submodule
git push
cd ../
rm -rf my-submodule
git submodule init
git submodule update

4
ฉันค่อนข้างจะเข้าใจว่าเกิดอะไรขึ้น แต่นี่ก็เป็นสิ่งเดียวที่ทำงานให้ฉัน ...
smilebomb

6

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

หากต้องการปิดใช้งานโหมดไฟล์ใน submodule คุณสามารถแก้ไข/.git/modules/path/to/your/submodule/configและเพิ่ม

[core]
  filemode = false

หากคุณต้องการเพิกเฉยต่อสถานะสกปรกทั้งหมดคุณสามารถตั้งค่าignore = dirtyคุณสมบัติในไฟล์/.gitmodulesแต่ฉันคิดว่าเป็นการดีกว่าที่จะปิดใช้งานโหมดไฟล์เท่านั้น


1

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

git submodule update --recursive --remote --init

แหล่งที่มา:

ฉันจะเปลี่ยนการเปลี่ยนแปลงเป็น submodule git ได้อย่างไร

วิธีที่ง่ายที่สุดในการดึง submodules คอมไพล์ล่าสุด

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