git update-index - สมมติว่าไม่มีการเปลี่ยนแปลงผลตอบแทน "fatal can't mark file"


133

ฉันมีปัญหาเดียวกันกับ OP ในโพสต์นี้แต่ฉันไม่เข้าใจคำตอบที่ทำเครื่องหมายว่าถูกต้อง (ฉันไม่เห็นว่ามันอธิบายวิธีแก้ไขสถานการณ์)

ฉันทำสิ่งนี้และได้รับข้อผิดพลาดนี้:

$ git update-index --assume-unchanged web.config
fatal: Unable to mark file web.config
  1. ไฟล์ IS ถูกเพิ่มในที่เก็บ

  2. มันไม่ได้อยู่ใน .git/info/exclude

  3. ไม่ได้อยู่ใน.gitignore(เป็น แต่ฉันเอาออกแล้วบังคับให้เพิ่ม web.config โดยใช้git add -f web.configมุ่งมั่นและผลักดันการเปลี่ยนแปลงเหล่านั้นไปยัง repo)

  4. เมื่อฉันทำ Git ls-files - มันไม่อยู่ที่นั่น

ฉันจะแก้ไขอะไรได้บ้าง


1
อีกครั้งอ่านคำตอบที่ได้รับการยอมรับในคำถามที่อ้างอิง: git ls-files -oมันจะไม่ปรากฏในการส่งออกของ ถ้าใช่แสดงว่าไม่อยู่ใน repo
eckes

การพิมพ์ผิดของฉันไม่อยู่ในรายการและแน่นอนที่สุดใน repo
Karen

คำตอบ:


108

ฉันประสบปัญหาเดียวกันกับคุณและทำตามสี่ขั้นตอนเดียวกับที่คุณระบุไว้ข้างต้นและได้ผลลัพธ์เช่นเดียวกัน git ls-files -oนี้รวมถึงความจริงที่ว่าไฟล์ของฉันถูกระบุว่าเมื่อมีการดำเนิน อย่างไรก็ตามในกรณีของฉันฉันได้ลองดำเนินการgit update-index --assume-unchangedกับไฟล์ที่ไม่อยู่ในรายการเมื่อเรียกใช้ls-files -oงานและฉันยังคงได้รับข้อผิดพลาดเดิม " fatal: Unable to mark file"

ฉันคิดว่าอาจเป็นข้อผิดพลาดและดาวน์โหลด git เวอร์ชันล่าสุด แต่ก็ไม่ได้ช่วยอะไร

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

โปรดทราบว่าสิ่งนี้ใช้กับ Git สำหรับ Windows ดังนั้นผลลัพธ์ของคุณอาจแตกต่างกันไปตามแพลตฟอร์มอื่น ๆ


4
ขอบคุณ SOOOO มาก! ได้ผล! ฉันคิดว่าฉันใช้ตัวพิมพ์เล็กทั้งหมดมาก่อนหรือ cd ไปที่โฟลเดอร์แล้วลองใช้คำสั่งนี้
กะเหรี่ยง

ถ้าไฟล์จะเปลี่ยนแสดงว่าผิด คำสั่งนี้เป็นสัญญาโดยผู้ใช้กับ Git ว่าไม่ต้องเสียรอบในการระบุไฟล์เพื่อตรวจสอบว่ามีการเปลี่ยนแปลงหรือไม่ (สำหรับระบบไฟล์ที่ช้า ;-) ในที่สุดหนึ่งในคำสั่ง Git จะสังเกตเห็นและคุณจะต้องประหลาดใจ กำลังปรับปรุงเอกสารเพื่อชี้แจงเรื่องนี้
Philip Oakley

1
ขอบคุณสิ่งนี้ช่วยให้ฉันค้นพบเชลล์สคริปต์ที่ไม่ดีในโปรเจ็กต์ทางอ้อม หากไม่มีเส้นทางนี้จะล้มเหลว! :)
uchuugaka

โปรดทราบว่าคำสั่งนี้จะใช้ไม่ได้กับไฟล์ที่ไม่ได้เวอร์ชัน หากคุณมีไฟล์ที่ไม่มีอยู่ในที่เก็บก็สามารถละเว้นใน. gitignore ได้และเด็กชายฉันรู้สึกโง่ที่พิมพ์สิ่งนี้ แต่ฉันคิดว่ามันอาจช่วยให้ใครบางคนโง่เหมือนฉันได้ :)
Jesse Ivy

เพียงเพื่อชี้แจงความคิดเห็นบางส่วนที่บอกใบ้หากคุณใช้เชลล์ Windows ที่ช่วยให้คุณหลีกเลี่ยงกรณีที่ไม่ตรงกันในซีดีของคุณคุณจะได้รับข้อผิดพลาดนี้ ให้ git พา ธ แบบเต็มไปยังไฟล์ (ด้วยตัวพิมพ์ที่ถูกต้อง) หรือ cd สำรองแล้วลงอีกครั้ง (อีกครั้งโดยใช้ตัวพิมพ์ที่ถูกต้องทุกขั้นตอน)
dlf

54

ฉันมีปัญหาเดียวกันกับ Mac การพิจารณาตัวพิมพ์เล็กและใหญ่ไม่ใช่ปัญหาสำหรับฉัน - ปัญหาคือฉันต้องรีเซ็ตคอมไพล์ก่อน:

ปัญหา:

 git update-index --assume-unchanged index.php
 fatal: Unable to mark file index.php

สารละลาย:

git reset HEAD
Unstaged changes after reset:
M   index.php
git update-index --assume-unchanged index.php

2
ฉันมีปัญหาเดียวกันกับ Mac และวิธีแก้ปัญหาที่แนะนำไม่ได้ผลสำหรับฉัน ความคิดใด ๆ ? ฉันพยายามหยุดติดตามไดเร็กทอรีชั่วคราวบนเครื่องของฉันเท่านั้นชื่อ dir คือ intellij_idea_project_files / เห็นได้ชัดว่าไฟล์ทั้งหมดในไดเร็กทอรีนี้ถูกทำเครื่องหมายอย่างถูกต้องยกเว้นไฟล์เดียวและนั่นคือ my_project_name.iml
Javad Sadeqzadeh

1
มีปัญหาเดียวกันและนี่เป็นวิธีแก้ปัญหาที่เหมาะกับฉันไม่ใช่ปัญหาเกี่ยวกับตัวพิมพ์เล็กและใหญ่
CesarPim

ฉันใช้ Mac ด้วยและสำหรับฉัน "วิธีแก้ปัญหา" คือการลบไฟล์ (ฉันจะโพสต์เป็นคำตอบ แต่ไม่แน่ใจว่าเกิดอะไรขึ้นอาจจะเกิดขึ้นในภายหลัง) Git บอกว่าไฟล์มีการเปลี่ยนแปลง (ฉันต้องการ--skip-worktree) ฉันกำจัดการเปลี่ยนแปลงในเครื่องโดยการเรียกใช้git restore .แต่การข้ามยังคงให้ข้อผิดพลาด ในที่สุดฉันก็ลองลบไฟล์ น่าตกใจที่คอมไพล์ไม่ได้บอกว่ามีการเปลี่ยนแปลง เห็นได้ชัดว่ามีบางอย่างที่ขี้ขลาดเกิดขึ้นเนื่องจาก git ติดตามมันอย่างแน่นอนและฉันก็ลบมันออกไปอย่างแน่นอนและแน่นอนว่ามันไม่ได้บอกว่านั่นเป็นการเปลี่ยนแปลง
Captain Man

25

ในกรณีของฉันทรีที่ฉันทำเครื่องหมายเป็นไดเร็กทอรีไม่ใช่ไฟล์ในกรณีของคุณและฉันไม่มีเครื่องหมายทับข้างหลังชื่อ

ไม่ถูกต้อง -

git update-index --assume-unchanged directory-name

ถูกต้อง -

git update-index --assume-unchanged directory-name/

สังเกตเครื่องหมายทับ (/) ในตอนท้าย


1
ขอบคุณ แต่เมื่อฉันทำสิ่งนี้ฉันได้รับ "ละเว้นเส้นทางไดเรกทอรีชื่อ /"
damian

@damian ระบุพา ธ ไฟล์แบบเต็มแทนไดเร็กทอรีหลัก
ฮิด

6

ถึงแก่ชีวิต: ไม่สามารถทำเครื่องหมายไฟล์ Localization / el-GR.js

สิ่งที่คุณทำได้คือ:

  1. ย้ายไปยังเส้นทางที่ถูกต้องซึ่งมีไฟล์อยู่ในเครื่องของคุณ (ใน GITBASH)
  2. อัปเดตดัชนี $git update-index --assume-unchanged <file name>

สิ่งนี้ช่วยฉันได้! :)


2
$ git update-index --assume-unchanged ./.idea/vcs.xml fatal: Unable to mark file .idea/vcs.xml $ cd .idea git update-index --assume-unchanged .ทำงานแล้วขอบคุณ!
AVProgrammer

4

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

ส่งผลให้เกิดข้อผิดพลาด "ร้ายแรง":

git update-index --assume-unchanged code/Solution Files/WebEssentials-Settings-json

หากต้องการแก้ไขเพียงใส่เครื่องหมายคำพูดรอบ ๆ เส้นทาง

git update-index --assume-unchanged "code/Solution Files/WebEssentials-Settings-json"

ในกรณีของฉันฉันมี / ถอยหลัง
Erik Bergstedt

4

ปัญหาของฉันคือฉันลองใช้คำสั่งด้วยสัญลักษณ์ * โดยสมมติว่ามันจะวนซ้ำ แต่มันไม่ใช่

สิ่งที่ฉันทำคือ

$ git reset HEAD
Unstaged changes after reset: 
M   .gradle/1.9/taskArtifacts/cache.properties.lock
M   .gradle/1.9/taskArtifacts/fileHashes.bin
M   .gradle/1.9/taskArtifacts/fileSnapshots.bin
M   .gradle/1.9/taskArtifacts/outputFileStates.bin
M   .gradle/1.9/taskArtifacts/taskArtifacts.bin

การดำเนินการ

$ git update-index --assume-unchanged .gradle/1.9/taskArtifacts/*

ทำงานให้ฉันแล้วและไม่ส่งผลให้ OPs และปัญหาของฉัน


4

ฉันมีปัญหานี้เมื่อพยายามยกเลิกการติดตามไฟล์ * .orig

นี่คือสิ่งที่ฉันทำเพื่อยกเลิกการติดตามพวกเขา:

$git reset -- *.orig

หากไม่ได้ผล:

$git clean -fd

5
เป็นเรื่องอันตรายที่จะขอให้ผู้อื่นดำเนินการคำสั่งโดยไม่บอกพวกเขาว่าคำสั่งนี้จะลบไฟล์ $ git clean -fd
HS Rathore

4

ตรวจสอบให้แน่ใจว่าได้เพิ่มไฟล์ลงใน git repo แล้วหากไม่เพิ่มไฟล์ใน git repo จากนั้นลองใช้งาน


3

--assume-unchangedเป็นเรื่องเกี่ยวกับระบบไฟล์ที่ช้าและผู้ใช้สัญญาว่า Git ไม่จำเป็นต้องตรวจสอบไฟล์นี้เนื่องจาก Git สามารถถือว่าไม่มีการเปลี่ยนแปลง แต่บางคำสั่งยังคงตรวจสอบและสร้างความประหลาดใจ!

อย่าใช้กับไฟล์ที่มีการเปลี่ยนแปลง

ขออภัยที่เป็นผู้นำเสนอข่าวนั้น (ฉันมีแพทช์อยู่ระหว่างดำเนินการเปลี่ยนแปลงเอกสารนั้น)


1
แล้วเราควรจะอัปเดตไฟล์เพื่อทำเครื่องหมายว่า 'ไม่ติดตามฉัน' ได้อย่างไร?
javadba

@javadba ดูstackoverflow.com/a/6964492/717355 'git rm --cached filename'
Philip Oakley

ขอบคุณ - โหวตให้ว่า: ฉันใช้มันจริงหลังจากโพสต์ที่นี่ โรงงาน
javadba

โปรดทราบว่าgit rm --cached filenameจะลบไฟล์เมื่อคนอื่นดึง
Ryan Taylor

@RyanTaylor ใช่สิ่งสำคัญสำหรับผู้ใช้ที่จะต้องตระหนักว่าคำสั่งของพวกเขากำลังพูดถึงอะไรซึ่งก็คือ 'หยุดติดตามสิ่งนี้, ลบออกจากการแก้ไขของฉัน' ได้อ่านมุมมองล่าสุดของผู้ดูแลและแพตช์ใหม่ของฉัน .. public-inbox.org/git/20161101210448.4692-1-philipoakley@iee.org/…
Philip Oakley

3

ในกรณีของฉันฉันพยายามใช้วิธีการใด ๆ ข้างต้น แต่โชคไม่ดี

หลังจากพยายามหลายครั้งฉันคิดว่าจะเพิ่มไฟล์ลงในดัชนี

git add myfile.php

Git ปฏิเสธการกระทำนี้ แต่เขาแนะนำให้ฉันทำการบังคับ

git add myfile.php -f

และนั่นได้ผลสำหรับฉัน


2

ตรวจสอบว่าคุณได้เช็คอิน "web.config" แล้ว

หากไม่เป็นเช่นนั้นคุณจะได้รับข้อความแสดงข้อผิดพลาดนี้


1

อาจมีประโยชน์สำหรับใครบางคน ฉันมีปัญหาเดียวกันและไม่มีปัญหาทางไวยากรณ์ไม่มีชื่อที่มีช่องว่างไม่มีปัญหาเส้นทางและคำสั่ง git reset ไม่ทำงาน ฉันกำลังคอมมิชชันจากโฟลเดอร์ภายใน apache www และบริการ apache หยุดทำงาน เริ่มบริการ apache อีกครั้งและข้อผิดพลาดหายไป


1

ข้อผิดพลาดทั่วไปอย่างหนึ่งเกี่ยวกับการใช้คำสั่งนี้คือการพยายามถือว่าไฟล์ไม่ได้ติดตามหรือไฟล์ที่ถูกละเว้นโดย git อยู่แล้ว

ตรวจสอบให้แน่ใจก่อนว่าไฟล์ถูกติดตามโดยการรัน

git ls-files | grep relative_path/to/file

หากไม่แสดงไฟล์ของคุณคุณต้องเพิ่มก่อน:

git add relative_path/to/file

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

git update-index --skip-worktree relative_path/to/file

หรือสำหรับโฟลเดอร์

git update-index --skip-worktree relative_path/to/folder/

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

git ls-files -v | grep ^S

อักขระ S แสดงถึงไฟล์ที่ข้าม


0

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


0

ตรวจสอบว่าไฟล์ที่จะทำเครื่องหมายมีอยู่และสะกดถูกต้องหรือไม่โดยเฉพาะเส้นทางไฟล์และตัวคั่นไฟล์ ตัวแยกไฟล์ของระบบ windows และระบบ linux อยู่ในทิศทางที่ต่างกัน


1
แม้ว่าจะไม่ผิด แต่คำตอบนี้ไม่ได้เพิ่มอะไรให้กับคำถาม คำแนะนำทั้งหมดของคุณได้ถูกนำเสนอในคำตอบที่มีอยู่แล้ว
Matt

0

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


0

ฉันมีปัญหาเดียวกันกับ cygwin ใน windows ให้เส้นทางไฟล์แบบเต็ม

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