Git: ฉันสามารถระงับการแสดงรายการ 'เนื้อหาที่แก้ไข' / รายการโมดูลย่อยที่สกปรกในสถานะ diff ฯลฯ ได้หรือไม่


123

เมื่อสักครู่ (ประมาณรุ่น 1.6.x ฉันคิดว่า) git เริ่มตระหนักถึงการเปลี่ยนแปลงภายในโมดูลย่อย ที่ทำหน้าที่รบกวนฉันเท่านั้น:

ผู้ขายสถานะ $ git | grep แก้ไข:
# modified: ผู้ขาย / ราง (เนื้อหาที่แก้ไข)
ผู้ขายต่าง $ git /
แตกต่าง - git a / ผู้ขาย / ราง b / ผู้ขาย / ราง
--- ก / ผู้ขาย / ราง
+++ ข / ผู้ขาย / ราง
@@ -1 +1 @@
- โครงการย่อยกระทำ 046c900df27994d454b7f906caa0e4226bb42b6f
+ โครงการย่อยกระทำ 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

กรุณาทำให้มันหยุด?

แก้ไข:

โอเคฉันมีคำตอบ ตอนนี้ฉันมีคำถามอื่น:

ใส่เข้าไปได้~/.gitconfigไหม จากการเริ่มต้นของฉันดูเหมือนว่าฉันทำไม่ได้และฉันไม่เห็นอะไรที่มีแนวโน้มจากการอ่านแพตช์ (ฉันเดาว่าฉันยังสามารถสร้างนามแฝงได้)


ฉันเห็นแพตช์บางอย่างในรายชื่อเมลคอมไพล์เกี่ยวกับเรื่องนี้ซึ่งเป็นเดทของเดือนมิถุนายน 2010 หวังว่าจะมีการเปิดตัวในเร็ว ๆ นี้ (google for 'git "--ignore-submodules = dirty"')
kch

+1 เพื่ออธิบายสาเหตุที่ข้อความเกิดขึ้น!
dotancohen

คำตอบ:


175

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

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

สาระสำคัญของมัน:

เมื่อคุณเพิ่มโมดูลย่อยแล้วจะมีไฟล์ชื่อ.gitmodulesอยู่ในรูทของที่เก็บของคุณ

เพียงเพิ่มหนึ่งบรรทัดใน.gitmodulesไฟล์นั้น:

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty

5
+1 แต่ฉันรวมส่วนหลักของบล็อกโพสต์ไว้ในคำตอบของคุณใน SO: ลิงก์ภายนอกของคุณอาจไม่ถูกต้องในวันหนึ่งซึ่งตรงข้ามกับคำตอบ SO ซึ่งจะอยู่ตลอดไป (ผ่าน SO ทิ้ง: blog.stackoverflow.com/2009/ 06 / … )
VonC

5
ฉันพบว่าฉันต้องการคอมมิตไฟล์. gitmodules ก่อนจึงจะgit statusทำงานได้ตามที่คาดไว้ นอกจากนี้คุณต้องมีอย่างน้อย 1.7.4 หรือดีกว่าฉันเชื่อว่า
aleemb

สำหรับ.gitignoreไฟล์มีเวอร์ชันส่วนตัวที่เรียกว่าexcludeอยู่ใน.git/info/ซึ่งไม่ได้รับการจัดการเวอร์ชัน มีไฟล์ที่เกี่ยวข้องสำหรับ.gitmodulesไฟล์ที่จะช่วยให้คุณระงับการเปลี่ยนแปลงในโมดูลย่อยเฉพาะในอินสแตนซ์ของที่เก็บพาเรนต์ของคุณโดยไม่ต้องทำการเปลี่ยนแปลง.gitmodules?
HelloGoodbye

2
ฉันไม่สามารถใช้งานกับโมดูลย่อยที่ติดตามสาขาได้ มันไม่ได้รับการสนับสนุนสำหรับสิ่งนั้น? `` [submodule "smstack / ansible / hosts"] path = smstack / ansible / hosts url = https: // ... branch = master ไม่สนใจ = dirty `` `` `
Marc Abramowitz

1
@MarcAbramowitz ฉันสะดุดกับปัญหาเดียวกันที่ฉันคิด - คุณพบวิธีแก้ปัญหานี้หรือไม่?
Sebastian G. Marinescu

61

มีการแจ้งการเปลี่ยนแปลงสองประเภทที่คุณสามารถระงับได้

อย่างแรกคือuntracked contentสิ่งที่เกิดขึ้นเมื่อคุณทำการเปลี่ยนแปลงกับโมดูลย่อยของคุณ แต่ยังไม่ได้ทำการเปลี่ยนแปลง ที่เก็บพาเรนต์จะสังเกตเห็นสิ่งเหล่านี้และgit statusรายงานตามนั้น:

modified: modules/media (untracked content)

คุณสามารถระงับสิ่งเหล่านี้ด้วย:

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = dirty

อย่างไรก็ตามเมื่อคุณยอมรับการเปลี่ยนแปลงเหล่านั้นที่เก็บพาเรนต์จะแจ้งให้ทราบอีกครั้งและรายงานตามนั้น:

modified:   modules/media (new commits)

หากคุณต้องการระงับสิ่งเหล่านี้ด้วยคุณต้องเพิกเฉยต่อallการเปลี่ยนแปลง

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = all

2
สำหรับ.gitignoreไฟล์มีเวอร์ชันส่วนตัวที่เรียกว่าexcludeอยู่ใน.git/info/ซึ่งไม่ได้รับการจัดการเวอร์ชัน มีไฟล์ที่เกี่ยวข้องสำหรับ.gitmodulesไฟล์ที่จะช่วยให้คุณระงับการเปลี่ยนแปลงในโมดูลย่อยเฉพาะในอินสแตนซ์ของที่เก็บพาเรนต์ของคุณโดยไม่ต้องทำการเปลี่ยนแปลง.gitmodules?
HelloGoodbye

1
HelloGoodbye: หากคุณตรวจสอบ. git / modules / $ MODULENAME / คุณจะเห็นไดเร็กทอรี. git สำหรับโมดูลนั้น การเปลี่ยนข้อมูล / ไม่รวมไฟล์ในตำแหน่งนั้นจะทำงาน
PaulW

1
ignore = allส่วนหนึ่งจะเป็นประโยชน์
Eric Wang

53

อัปเดต: ดูคำตอบของnilshaldenwang (และโหวตเพิ่ม ) เกี่ยวกับความเป็นไปได้ในการเพิ่มพารามิเตอร์ config ลงในไฟล์เพื่อละเว้นสถานะสกปรกของโมดูลย่อยที่กำหนด.gitmodules

ignore = dirty

ดังนั้น git 1.7.2 จึงหมดและมี--ignore-submodulesตัวเลือกสำหรับstatus.

จากgit help status:

ละเลย-submodules [= <เมื่อ>]
    ละเว้นการเปลี่ยนแปลงโมดูลย่อยเมื่อค้นหาการเปลี่ยนแปลง
    <เมื่อ> อาจเป็นได้ทั้ง "ไม่ถูกติดตาม" "สกปรก" หรือ "ทั้งหมด" ซึ่ง
    เป็นค่าเริ่มต้น เมื่อ "ไม่ติดตาม" ใช้โมดูลย่อยคือ
    ไม่ถือว่าสกปรกเมื่อมีเพียงสิ่งที่ไม่ถูกติดตาม
    เนื้อหา (แต่ยังคงสแกนหาเนื้อหาที่แก้ไข)
    การใช้ "สกปรก" จะละเว้นการเปลี่ยนแปลงทั้งหมดในแผนผังงานของ
    โมดูลย่อยเปลี่ยนเฉพาะคอมมิตที่เก็บไว้ในไฟล์
    superproject จะแสดงขึ้น (นี่คือพฤติกรรมก่อนหน้านี้
    1.7.0) การใช้ "ทั้งหมด" จะซ่อนการเปลี่ยนแปลงทั้งหมดของโมดูลย่อย (และ
    ระงับเอาต์พุตของการสรุปโมดูลย่อยเมื่อ
    config option status.submodulesummary ถูกตั้งค่า)

ค่าที่ฉันต้องการคือdirty.

git status --ignore-submodules=dirty

ฉันใช้นามแฝงเพราะฉันขี้เกียจ:

alias gst='git status --ignore-submodules=dirty'

2
เนื่องจากนี่เป็นคำตอบที่ยอมรับฉันคิดว่าคุณควรเพิ่มตัวเลือกในการเพิ่มignore=dirtyรายการแต่ละรายการใน.gitmodulesไฟล์ที่นี่
Andriy Drozdyuk

14

ดังที่คุณกล่าวถึงโมดูลย่อย git patch : ละเว้นโมดูลย่อยที่สกปรกเพื่อสรุปและสถานะอยู่ในการสร้าง

ยังประกาศในรุ่นGit 1.7.2-rc2 :

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------

" git status" เรียนรู้ " --ignore-submodules" ตัวเลือก

ความหมาย:

git config --global diff.ignoreSubmodules dirty

เกี่ยวกับสิ่งนี้ในฐานะตัวเลือกไม่ใช่แนวทางที่เลือกไว้ในตอนนี้ :

หลังจากซีรีส์นี้ฉันวางแผนที่จะเพิ่มตัวเลือกการกำหนดค่า ' ignore' เป็น.gitmodulesซึ่งสามารถตั้งค่าให้โมดูลย่อยแต่ละโมดูลเป็น "ทั้งหมด" "สกปรก" "ไม่ติดตาม" หรือ "ไม่มี" (ค่าเริ่มต้น)

" git diff" และ " git status" จะใช้ค่ากำหนดค่านั้นสำหรับโมดูลย่อยแต่ละโมดูล
การใช้ " --ignore-submodule" ลบล้างค่าเริ่มต้นนี้ (และพารามิเตอร์ใหม่ "none" จะถูกเพิ่มที่นั่นเพื่อให้สามารถลบล้างการตั้งค่าการกำหนดค่าได้)

และเพื่อหลีกเลี่ยงไม่ให้ต้องทำ " git submdule sync" ทุกครั้งที่ตัวเลือกนั้นเปลี่ยนแปลงฉันต้องการค้นหาตัวเลือกนี้.git/configก่อน
หากไม่พบที่นั่นจะถูกนำมาจาก.gitmodulesถ้ามีอยู่

ดังนั้นผู้ใช้จึงสามารถลบล้างการตั้งค่าได้ แต่หากไม่เป็นเช่นนั้นอัปสตรีมสามารถเปลี่ยนได้อย่างง่ายดาย (เช่นเมื่อ.gitignoreมีการอัปเดตโมดูลย่อยเพื่อให้ " ignore=untracked" ไม่จำเป็นอีกต่อไปก็สามารถลบออกได้)
นอกจากนี้การเปลี่ยนสาขาจะมีผลทันทีหากignoreรายการ '' .gitmodulesแตกต่างกันระหว่างสาขา


อีกวิธีหนึ่งในการสร้างสถานะ git (หรือคำสั่ง git ใด ๆ ) เพื่อละเว้นโมดูลย่อยที่เฉพาะเจาะจงสามารถใช้ได้กับ Git 2.13 (Q2 2017):

git config submodule.<name>.active false

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


ฉันอัปเดตคำถามด้วยบิต gitconfig เพียงแค่พูดคุยในกรณีที่คุณรู้คำตอบ
กช

@kch: ฉันได้อัปเดตคำตอบด้วยแนวทางที่เสนอในปัจจุบันสำหรับการจัดเก็บการตั้งค่าประเภทนี้
VonC

@drozzy: ตามที่คุณพูดถึงในความคิดเห็นอื่น ๆ ของคุณ: " ignore = dirty"
VonC

1
@drozzy: ฉันได้เพิ่มคะแนนและตอบคำตอบของ nilshaldenwang ให้สมบูรณ์ด้วยพารามิเตอร์ config เพิ่มเติม "เพิกเฉย = สกปรก" ฉันได้แก้ไขคำตอบอย่างเป็นทางการโดยเพิ่มลิงก์ไปยังโพสต์ของ nilshaldenwang
VonC

ขอบคุณไม่มีอะไรเป็นส่วนตัว แต่ฉันแค่อยากได้คำตอบที่เป็นประโยชน์มากขึ้นซึ่งตอนแรกฉันพลาดไป!
Andriy Drozdyuk

11

คุณยังสามารถใช้

% git config [--global] submodule.ignore dirty

เพื่อตั้งค่าsubmodule.ignore = dirtyใน.git/configไฟล์ของคุณ --globalจะตั้งค่าสถานะละเว้นในของคุณ~/.gitconfigและใช้กับที่เก็บทั้งหมดของคุณ ไม่ควรตั้งค่า.git/configสำหรับ repo ที่คุณอยู่ในปัจจุบัน

เอกสารเดียวที่ฉันสามารถหาเกี่ยวกับเรื่องนี้เป็นsubmodule.<name>.ignoreที่เอกสาร Git-config ฉันย้ายจากไฟล์. gitmodules ไปยัง ~ / .gitconfig ของฉันและมันก็ยังใช้งานได้สำหรับฉัน


@ PawełGościckiฉันสามารถยืนยันได้ว่ามันทำงานบน Git 2.0.0
Ciro Santilli 郝海东冠状病六四事件法轮功

6

คุณต้องเพิ่ม

ไม่สนใจ = สกปรก

เป็น. gitmodules


คุณเพิ่มลงใน. gitmodules ที่ไหน
Andriy Drozdyuk

@drozzy คุณเพิ่มไว้ในส่วนของโมดูลย่อยแต่ละโมดูลที่คุณต้องการละเว้นโดยที่ค่า "path" และ "url" ถูกกำหนดไว้
jsdalton

2

ดังนั้น git v1.7.2-rc2 จึงมีสิ่งที่ฉันต้องการ:

$ git diff --ignore-submodules = ผู้ขายที่สกปรก
# ไม่มีเอาต์พุต
$ git status --ignore-submodules = ผู้ขายที่สกปรก
# สาขา…
ไม่มีอะไรให้กระทำ (ไดเรกทอรีการทำงานสะอาด)

สร้าง git howto ของคุณเอง:

# get git
git clone git://git.kernel.org/pub/scm/git/git.git git
cd git
git checkout v1.7.2-rc2

# make git. beware of setting prefix
make configure
./configure --prefix=/usr/local
make
sudo make install

# you REALLY don't want to `make doc`, use this instead
sudo make quick-install-man
sudo make quick-install-html

1
ฉันนับเจ็ด gits ที่นี่: git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen

2

ผมเคยตอบคำถามนี้ที่นี่ในรายละเอียดมากขึ้น

เพียงแค่เรียกใช้

git config --global diff.ignoreSubmodules dirty

เพื่อเพิ่มตัวเลือกการกำหนดค่าภายในเพื่อละเว้นการเปลี่ยนแปลงเหล่านั้น


1

คุณอาจไม่ต้องการเพิ่มignore = dirtyเข้าไป.gitmodulesคุณอาจต้องการเลือกมากขึ้นเกี่ยวกับการเปลี่ยนแปลงที่คุณต้องการละเว้น

จะทำอย่างไรที่เพิ่มรูปแบบการ.git/submodule_foo/bar/info/excludeที่submodule_foo/bar/เป็นเส้นทางของ submodule ที่

รูปแบบจะคล้ายกับรูปแบบที่คุณต้องการเพิ่ม.gitignoreโดยรูทเป็นไดเร็กทอรีโมดูลย่อย ตัวอย่างเช่นรูปแบบนี้ละเว้นbuildไดเร็กทอรีในโมดูลย่อยsubmodule_foo/bar/:

# in .git/submodule_foo/bar/info/exclude:
/build/

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