เลิกทำ git update-index - สมมติว่าไม่เปลี่ยนแปลง <file>


462

วิธีที่คุณ Git เพิกเฉยต่อการดู / ติดตามไฟล์ / ไฟล์ที่ต้องการ คุณเรียกใช้สิ่งนี้:

git update-index --assume-unchanged <file>

ตอนนี้คุณจะยกเลิกได้อย่างไรเพื่อให้พวกเขาดูอีกครั้ง (เราเรียกมันว่ายกเลิกการสันนิษฐาน)


5
เพียงข้อสังเกตที่จะบอกว่าดูเหมือนว่า skip-worktree นั้นมีความเป็นไปได้ที่คุณจะใช้งานได้ดีกว่าการสันนิษฐานที่ไม่เปลี่ยนแปลงเว้นแต่ประสิทธิภาพของ git คือปัญหาของคุณ stackoverflow.com/questions/13630849/…
GreenAsJade

คำตอบ:


587

ในการรับเลิกทำ / แสดงไฟล์ / ไฟล์ที่ถูกตั้งค่าให้ถือว่าไม่เปลี่ยนแปลงให้ดำเนินการดังนี้

git update-index --no-assume-unchanged <file>

ที่จะได้รับรายชื่อของ dir ของ / ไฟล์ที่มีassume-unchangedทำงานนี้ :

git ls-files -v|grep '^h'


7
การปรับปรุงคำสั่ง grep ของคุณเล็กน้อยอาจใช้ '^ [az]' เพื่อตรวจจับไฟล์ที่ถูกละเว้นทั้งหมดเนื่องจากแท็กตัวอักษรตัวแรกอาจเป็นตัวอักษรอื่นที่ไม่ใช่ 'H' / 'h' จากgit-scm.com/docs/git-ls-files : ตัวเลือกนี้ระบุสถานะไฟล์ด้วยแท็กต่อไปนี้ (ตามด้วยช่องว่าง) ที่จุดเริ่มต้นของแต่ละบรรทัด: H :: cached S :: skip-worktree M: : unmerged R :: ลบ / ลบ C :: modified /
change

8
เคล็ดลับที่มีประโยชน์อีกอย่างคือgit ls-files -v|grep '^h'|cut -c3-ซึ่งจะให้ชื่อไฟล์แก่คุณโดยไม่มีคำนำหน้า "h"
Retsam

9
หากคุณไม่ทราบว่าไฟล์อีกต่อไปที่คุณเพียงแค่ใช้assume-unchanged git update-index --really-refreshด้วยคำสั่งนั้นคุณไม่จำเป็นต้องค้นหาไฟล์git ls-filesก่อน
theDmi

102

หากนี่เป็นคำสั่งที่คุณใช้บ่อย - คุณอาจต้องการพิจารณามีนามแฝงด้วยเช่นกัน เพิ่มในโลกของคุณ.gitconfig:

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

วิธีตั้งค่านามแฝง (หากคุณยังไม่รู้)

git config --configLocation alias.aliasName 'command --options'

ตัวอย่าง:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

หลังจากบันทึกสิ่งนี้ไปยังคุณ.gitconfigคุณสามารถเรียกใช้คำสั่งสะอาด

git hide myfile.ext

หรือ

git unhide myfile.ext

นี้เอกสารคอมไพล์เป็นประโยชน์มาก

ตามความคิดเห็นนี่เป็นชื่อแทนที่เป็นประโยชน์ในการค้นหาว่าไฟล์ใดถูกซ่อนอยู่ในปัจจุบัน:

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-

2
นามแฝงนี้มีประโยชน์เช่นกัน:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

42

ฟังก์ชั่นดัชนีการปรับปรุง git มีหลายตัวเลือกที่คุณสามารถค้นหาพิมพ์ด้านล่าง:

git update-index --help

ที่นี่คุณจะพบตัวเลือกต่าง ๆ - วิธีจัดการกับฟังก์ชั่นอัพเดทดัชนี

[ถ้าคุณไม่รู้ชื่อไฟล์]

git update-index --really-refresh 

[ถ้าคุณรู้ชื่อไฟล์]

git update-index --no-assume-unchanged <file>

จะคืนค่าไฟล์ทั้งหมดที่ถูกเพิ่มในรายการเพิกเฉยผ่าน

git update-index --assume-unchanged <file>

git update-index - รีลีส - รีเฟรช, ยกเลิกทั้งหมดสมมติว่า - ไม่เปลี่ยนแปลงที่ฉันทำ, ขอบคุณสำหรับเคล็ดลับ
Sérgio

git update-index --no-assume-unchanged <file>ช่วยชีวิตฉันไว้ .. โอเคฉันสามารถซิงค์โฟลเดอร์อีกครั้ง แต่ฉันต้องการทางออกที่แท้จริงสำหรับปัญหานี้
Cagatay Ulubay

38

ฉันถือว่าคุณหมายถึง--assume-unchangedเพราะฉันไม่เห็น--assume-changedตัวเลือกใด ๆ ผกผันของมี--assume-unchanged--no-assume-unchanged


32

หากต้องการสังเคราะห์คำตอบดั้งเดิมที่ยอดเยี่ยมจาก @adardesign, @adswebwork และ @AnkitVishwakarma และความคิดเห็นจาก @Bdoserror, @Retsam, @seanf และ @torek พร้อมลิงก์เอกสารเพิ่มเติมและชื่อแทนที่กระชับ ...

คำสั่งพื้นฐาน

หากต้องการรีเซ็ตไฟล์ที่สันนิษฐานว่าไม่เปลี่ยนแปลงกลับสู่ปกติ:

git update-index --no-assume-unchanged <file>

หากต้องการแสดงรายการไฟล์ทั้งหมดที่ถือว่าไม่มีการเปลี่ยนแปลง:

git ls-files -v | grep '^[a-z]' | cut -c3-

หากต้องการรีเซ็ตไฟล์ที่ไม่มีการเปลี่ยนแปลงให้กลับเป็นปกติ:

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

หมายเหตุ:คำสั่งนี้ซึ่งอยู่ในรายการอื่นจะไม่ปรากฏขึ้นเพื่อรีเซ็ตไฟล์ที่ไม่มีการเปลี่ยนแปลงทั้งหมดอีกต่อไป (ฉันเชื่อว่ามันเคยใช้และแสดงไว้ก่อนหน้านี้ว่าเป็นโซลูชัน):

git update-index --really-refresh

ทางลัด

ในการทำให้งานทั่วไปเหล่านี้ง่ายต่อการใช้งานใน git ให้เพิ่ม / อัพเดทส่วนaliasต่อไปนี้.gitconfigสำหรับผู้ใช้ของคุณ (เช่น~/.gitconfigในระบบ * nix หรือ macOS):

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-

1
สำหรับgit hiddenคุณสามารถได้รับผลกระทบเดียวกันโดยไม่ต้องใช้นามแฝงหรือสคริปต์ของเชลล์โดยใช้!ดังนี้:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

1
--really-refreshไม่ (หรือไม่ทำอีกต่อไปอาจเป็นครั้งเดียว) ล้างค่าสถานะสมมติที่ไม่เปลี่ยนแปลงในไฟล์ดัชนี
torek

ขอบคุณ @torek! ฉันยืนยันพฤติกรรมที่คุณอธิบายไว้และฉันได้อัปเดตคำตอบด้วยวิธีแก้ไขปัญหาที่แตกต่างกันในกรณี "รีเซ็ตทั้งหมด"
ดัมและอีฟจะ

20

หากคุณต้องการยกเลิกไฟล์ทั้งหมดที่นำไปใช้ถือว่าไม่มีการเปลี่ยนแปลงด้วยสถานะใด ๆ ไม่เพียง แต่แคช (git ทำเครื่องหมายด้วยอักขระในตัวพิมพ์เล็ก) คุณสามารถใช้คำสั่งต่อไปนี้:

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v จะพิมพ์ไฟล์ทั้งหมดด้วยสถานะ
  2. grep '^[a-z]' จะกรองไฟล์และเลือกจะถือว่าไม่เปลี่ยนแปลงเท่านั้น
  3. cut -c 3- จะลบสถานะและออกจากเส้นทางเท่านั้นโดยตัดจากอักขระ 3-rd ไปยังจุดสิ้นสุด
  4. tr '\012' '\000' จะแทนที่อักขระจุดสิ้นสุดของบรรทัด (\ 012) เป็นศูนย์ (\ 000)
  5. xargs -0 git update-index --no-assume-unchangedจะผ่านเส้นทางทั้งหมดคั่นด้วยอักขระศูนย์ถึงgit update-index --no-assume-unchangedเพื่อยกเลิก

มันมีประโยชน์มาก ขอบคุณสำหรับข้อมูลรายละเอียด!
Chamithra Thenuwara

11

การเพิ่ม@adardesignคำตอบหากคุณต้องการรีเซ็ตไฟล์ทั้งหมดที่เพิ่มไว้ในassume-unchangedรายการno-assume-unchangedในครั้งเดียวคุณสามารถทำสิ่งต่อไปนี้:

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

นี่จะเป็นการตัดเอาท์อักขระสองตัวออกจาก grep ie "h "จากนั้นให้เว้นช่องว่างใด ๆ ที่อาจมีอยู่ในชื่อไฟล์และในที่สุด|| trueจะป้องกันคำสั่งให้ยุติก่อนกำหนดในกรณีที่ไฟล์บางไฟล์ในลูปมีข้อผิดพลาด


4

หากคุณใช้Git Extensionsให้ทำตามขั้นตอนด้านล่าง:

  1. ไปที่หน้าต่างคอมมิท
  2. คลิกที่เลื่อนลงชื่อเปลี่ยนแปลงไดเรกทอรีการทำงาน
  3. เลือกแสดง assummed-เปลี่ยนแปลงไฟล์ตัวเลือก
  4. คลิกขวาที่ไฟล์ที่คุณต้องการแยกออก
  5. เลือกทำไม่ assumme ไม่เปลี่ยนแปลง

คุณทำเสร็จแล้ว


0

ไม่มีอะไรที่นี่ที่ไม่ครอบคลุม แต่ต้องการเพิ่ม 2 เซนต์ของฉัน บางครั้งฉันเรียกใช้งานบิลด์และมีการเปลี่ยนแปลงไฟล์จำนวนมากจากนั้นฉันก็ต้องการทำงานกับบางสิ่งดังนั้นคำสั่งนี้ช่วยฉันได้มากจริงๆ

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

หวังว่าคนอื่นจะเห็นว่ามีประโยชน์เช่นกัน


ฉันคิดว่าคุณจะได้รับประโยชน์จากการใช้.gitignoreเพื่อเพิกเฉยต่องานสร้างของคุณ
Nick

1
ฉันมี.gitignoreแต่นั่นเป็นบางครั้งในประสบการณ์ของฉันไม่เพียงพอ แต่ฉันเข้าใจบริบทที่คุณกำลังพูดนี้
Tyagi Akhilesh

0

ไม่มีวิธีแก้ปัญหาใดที่เหมาะกับฉันใน Windows - ดูเหมือนว่าจะใช้ตัวพิมพ์ใหญ่Hแทนhสถานะไฟล์และคำสั่ง grep ต้องใช้คาเร็ตพิเศษซึ่ง^แสดงถึงจุดเริ่มต้นของบรรทัดรวมถึงการลบอักขระถัดไป

โซลูชัน Windows

  1. เปิด Git Bash แล้วเปลี่ยนเป็นไดเรกทอรีระดับบนสุดที่เกี่ยวข้อง
  2. git ls-files -v | grep '^^H' เพื่อแสดงรายการไฟล์ที่ไม่ได้ลบทั้งหมด
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree เพื่อยกเลิกการข้ามไฟล์ของไฟล์ทั้งหมดที่ทำผ่าน update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged เพื่อยกเลิกการข้ามไฟล์ของไฟล์ทั้งหมดที่ทำผ่าน update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' เพื่อแสดงรายการไฟล์ที่ยังไม่ได้ลบอีกครั้งและตรวจสอบว่าคำสั่งด้านบนใช้งานได้หรือไม่ - ตอนนี้ไม่ควรส่งคืนอะไรเลย

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