git update-index - สมมติว่าไม่มีการเปลี่ยนแปลงในไดเรกทอรี


101

คอมไพล์ 1.7.12

ฉันต้องการทำเครื่องหมายไฟล์ทั้งหมดด้านล่างไดเร็กทอรีที่กำหนดว่าไม่เปลี่ยนแปลง

1) git update-index --assume-unchaged dir/ให้ "ละเว้นเส้นทาง"

2) git update-index --assume-unchaged dir/*ล้มเหลวอย่างรวดเร็วเนื่องจากจะพบไฟล์ที่ไม่ได้รับการติดตามดังนั้นจึงให้ "fatal: Unable to mark file" และออก

3) ลองสร้างรายการไฟล์เพื่อทำเครื่องหมาย ลงในไดเรกทอรีที่ต้องการแล้ววิ่งcd git ls-files | tr '\n' ' ' | git update-index --assume-unchangedสิ่งนี้ไม่มีข้อความแสดงข้อผิดพลาด แต่ทำเครื่องหมายไฟล์ไม่สำเร็จ ส่วนแรกของคำสั่งgit ls-files | tr '\n' ' 'สร้างรายการที่คั่นด้วยช่องว่างของไฟล์ทั้งหมดที่ฉันต้องการทำเครื่องหมายอย่างถูกต้อง หากฉันคัดลอกและวางผลลัพธ์ของคำสั่งนั้นลงในบรรทัดคำสั่งคำสั่งนั้นจะgit update-indexทำงาน อะไรไม่ทำงานกับท่อ?

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

คำตอบ:


176

git update-index ต้องการชื่อไฟล์ในบรรทัดคำสั่งไม่ใช่ในอินพุตมาตรฐาน

ขั้นตอนที่ 1:

cd ในโฟลเดอร์ที่คุณต้องการถือว่าไม่มีการเปลี่ยนแปลง

ขั้นตอนที่ 2:

คุณสามารถทำสิ่งนี้ได้:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

หรือ

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

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

git ls-files -z | xargs -0 git update-index --assume-unchanged

แก้ไข: นิติบุคคลที่จัดตั้งขึ้นข้อมูลจาก @MatthewScharley git ls-files -zเกี่ยวกับ

คำสั่งของ Windows

หมายเหตุ:หากคุณใช้ Windows ให้ใช้Git Bashเพื่อเรียกใช้คำสั่งเหล่านี้


2
FYI ว่า `| tr '\ n' '' `` บิตไม่จำเป็น
VáclavSlavík

7
@twalberg: คุณสามารถใช้ได้git ls-files -z
Matthew Scharley

2
@twalberg วิธียกเลิกคำสั่งนี้ "git ls-files -z | xargs -0 git update-index --assume-unchanged"
Mohamed Hussain

3
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchangedฉันคิดว่า ...
twalberg

1
git ls-files -z | git update-index -z --stdinสะอาดกว่า
Jed

22

findคำสั่งจาก GNU Findutils มี-execตัวเลือกที่เอาที่สุดของความยุ่งยากของการใช้xargsแม้ไวยากรณ์ที่เป็นพิเศษเล็ก ๆ น้อย ๆ อย่างไรก็ตามมันจัดการกับชื่อไฟล์ที่มีช่องว่างได้อย่างสมบูรณ์แบบ

คำสั่งนี้จะได้รับ git เพื่อให้ถือว่าไฟล์ทั้งหมดในและภายใต้ไดเร็กทอรีที่แสดงไม่เปลี่ยนแปลง:

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Find จะใช้ทุกอาร์กิวเมนต์หลังจาก-execจนถึง;(ซึ่งคุณต้องหลีกเลี่ยงเพื่อไม่ให้เชลล์กินมัน) และเรียกใช้หนึ่งครั้งสำหรับแต่ละไฟล์ที่พบในขณะที่แทนที่{}(อีกครั้งให้ยกมาเพียงครั้งเดียวเพื่อที่เชลล์ของคุณจะไม่กินมัน) ด้วยชื่อไฟล์ที่พบ

การใช้findเกณฑ์การจับคู่ของ (ความลึกในการเรียกซ้ำสูงสุดไม่ว่าการจับคู่จะเป็นไฟล์หรือเป็นไดเร็กทอรีชื่อไฟล์นั้นตรงกับนิพจน์หรือไม่) และ-execคุณสามารถทำสิ่งที่มีประสิทธิภาพได้ทุกประเภท

ไม่แน่ใจเกี่ยวกับการใช้งานfindคำสั่งอื่น ๆ YMMV.


2
-execเป็นตัวเลือกที่ได้มาตรฐาน คุณยังสามารถ-exec git update-index --assume-unchanged {} +(กำหนดโดยมาตรฐาน) ซึ่งส่งชื่อไฟล์หลายชื่อไปยังคำสั่งพร้อมกันเพื่อลดจำนวนครั้งที่เรียกคำสั่ง git
Tom Fenech

16

.git/info/excludeเพิ่มชื่อไดเรกทอรีไป วิธีนี้ใช้ได้กับไฟล์ที่ไม่มีการติดตาม


งานนี้สุดยอด! คุณทราบหรือไม่ว่ามันใช้ได้กับไฟล์ด้วยหรือไม่?
betomoretti

แต่สิ่งนี้ไม่ได้ดัน github ไฟล์ที่ไม่ได้ติดตาม! มีวิธีใดบ้างที่เป็นไปได้ที่จะเพิกเฉยจากบันทึก แต่เก็บไว้ใน repos จริง ๆ !
Mahmoud Zalt

2

เย็ป

git update-index --assume-unchanged

ใช้งานได้กับไฟล์เท่านั้นไม่ใช่กับไดเร็กทอรี ฉันคิดว่าหนึ่งในวิธีที่เร็วกว่า:

cd dir
ls | xargs -l git update-index --assume-unchanged

2
แทนการใช้cdคุณสามารถส่ง dir git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIRเป็นอาร์กิวเมนต์สุดท้าย:
kzh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.