git update-index - trả về không thay đổi, không thể đánh dấu tập tin


133

Tôi đang gặp vấn đề tương tự như OP trên bài đăng này , nhưng tôi không hiểu câu trả lời được đánh dấu là chính xác (tôi không thấy rằng nó giải thích cách khắc phục tình huống này)

Tôi làm điều này và nhận được lỗi này:

$ git update-index --assume-unchanged web.config
fatal: Unable to mark file web.config
  1. Tệp IS được thêm vào kho lưu trữ

  2. Nó không ở trong .git/info/exclude

  3. Nó KHÔNG ở .gitignore(nó đã được, nhưng tôi đã lấy nó ra, sau đó buộc web.config phải được thêm bằng cách sử dụng git add -f web.config, cam kết và đẩy những thay đổi đó vào repo)

  4. Khi tôi làm Git ls-files -o nó KHÔNG ở đó

Vậy tôi có thể làm gì để khắc phục?


1
đọc lại câu trả lời được chấp nhận trong câu hỏi được tham chiếu: nó sẽ KHÔNG xuất hiện trong đầu ra của git ls-files -o. Nếu vậy, nó không có trong repo.
eckes

Lỗi đánh máy của tôi, nó KHÔNG có trong danh sách, và nó chắc chắn nhất là trong repo
Karen

Câu trả lời:


108

Tôi đã có cùng một vấn đề như bạn, và đã làm theo bốn bước tương tự như bạn đã chỉ ra ở trên, và có kết quả tương tự. Điều này bao gồm thực tế là tập tin của tôi đã được liệt kê khi thực hiện git ls-files -o. Tuy nhiên, trong trường hợp của tôi, tôi cũng đã thử thực thi git update-index --assume-unchangedđối với một tệp không được liệt kê khi thực thi ls-files -ovà tôi vẫn nhận được lỗi tương tự " fatal: Unable to mark file".

Tôi nghĩ rằng có lẽ đó là một lỗi và đã tải xuống phiên bản git mới nhất, nhưng điều này không giúp được gì.

Điều cuối cùng tôi nhận ra là lệnh này phân biệt chữ hoa chữ thường! Điều này bao gồm đường dẫn đầy đủ và tên tệp. Sau khi cập nhật đường dẫn đến thư mục để đường dẫn đầy đủ được chỉ định với vỏ phù hợp, lệnh được thực thi đúng.

Lưu ý rằng đây là với Git cho Windows, vì vậy kết quả của bạn có thể thay đổi với các nền tảng khác.


4
Cảm ơn bạn SOOOO nhiều! Điều này đã làm việc! Tôi nghĩ rằng tôi đã sử dụng tất cả các chữ thường trước hoặc cd vào thư mục và sau đó thử sử dụng lệnh này.
Karen

Nếu tập tin sẽ thay đổi thì đây là sai. Lệnh này là một lời hứa, bởi người dùng, đối với Git, rằng nó không phải lãng phí chu kỳ trong việc nêu rõ tệp để phát hiện nếu nó đã thay đổi (đối với các hệ thống tệp chậm ;-). Cuối cùng, một trong các lệnh Git sẽ thông báo và bạn sẽ được bất ngờ. Các tài liệu đang được cập nhật để làm rõ điều này.
Philip Oakley

1
Cảm ơn, điều này gián tiếp giúp tôi khám phá một số kịch bản shell xấu trong một dự án. Nếu một con đường không tồn tại, điều này sẽ thất bại! :)
uchuugaka

Cũng lưu ý rằng lệnh này sẽ không hoạt động đối với các tệp không được đảo ngược. Nếu bạn có một tệp không tồn tại trong kho lưu trữ, nó có thể bị bỏ qua trong .gitignore, và tôi có cảm thấy ngớ ngẩn khi gõ nó nhưng tôi nghĩ nó có thể giúp ai đó ngu ngốc như tôi. :)
Jesse Ivy

Chỉ cần làm rõ những gì một số ý kiến ​​đã gợi ý, nếu bạn đang sử dụng trình bao Windows cho phép bạn thoát khỏi trường hợp không khớp trong đĩa CD, bạn sẽ gặp lỗi này. Hoặc cung cấp cho git đường dẫn đầy đủ đến tệp (với trường hợp chính xác) hoặc cd sao lưu rồi lại xuống (một lần nữa, với trường hợp chính xác ở mọi giai đoạn).
dlf

54

Tôi đã có cùng một vấn đề trên máy Mac. Phân biệt chữ hoa chữ thường không phải là vấn đề đối với tôi - vấn đề là tôi cần thiết lập lại git của mình trước:

Vấn đề:

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

Giải pháp:

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

2
Tôi đang gặp vấn đề tương tự trên Mac và không có cách giải quyết nào được đề xuất cho tôi. Bất kỳ ý tưởng? Tôi đang cố gắng chỉ dừng theo dõi một thư mục trên máy của mình, tên của thư mục là intellij_idea_project_files /. Rõ ràng tất cả các tệp trong thư mục này đã được đánh dấu đúng trừ một tệp và đó là my_project_name.iml.
Javad Sadeqzadeh

1
có cùng một vấn đề và đây là giải pháp hiệu quả với tôi, không phải là vấn đề nhạy cảm với trường hợp
CesarPim

Tôi cũng trên Mac và đối với tôi "giải pháp" là xóa tệp. (Tôi sẽ đăng bài này dưới dạng câu trả lời nhưng tôi không chắc chuyện gì đã xảy ra, có thể sau đó.) Một cái gì đó kỳ lạ đã xảy ra. Git đã nói rằng tập tin đã được thay đổi (tôi muốn --skip-worktree). Tôi đã thoát khỏi những thay đổi cục bộ bằng cách chạy git restore .nhưng bỏ qua vẫn đưa ra lỗi. Cuối cùng tôi đã cố gắng xóa các tập tin. Thật sốc, git đã không nói rằng có một sự thay đổi. Vì vậy, rõ ràng một cái gì đó thú vị đã xảy ra kể từ khi git chắc chắn đang theo dõi nó và tôi chắc chắn đã xóa nó và nó chắc chắn không nói rằng đó là một sự thay đổi.
Thuyền trưởng Man

25

Trong trường hợp của tôi, cây tôi đã đánh dấu là một thư mục chứ không phải là một tệp như trong trường hợp của bạn và tôi đã bỏ lỡ dấu gạch chéo phía sau tên của nó.

Không chính xác -

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

Chính xác -

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

Lưu ý dấu gạch chéo (/) cuối cùng.


1
Cảm ơn, nhưng khi tôi làm điều này, tôi nhận được "Bỏ qua tên thư mục đường dẫn /"
damian

@damian Chỉ định đường dẫn tệp đầy đủ thay vì thư mục mẹ.
Nahid

6

gây tử vong: Không thể đánh dấu tệp Bản địa hóa / el-GR.js

Những gì bạn có thể làm là:

  1. Di chuyển đến đúng đường dẫn nơi tệp có trong địa phương của bạn (trong GITBASH)
  2. Cập nhật chỉ mục $git update-index --assume-unchanged <file name>

Điều này đã giúp tôi! :)


2
$ git update-index --assume-unchanged ./.idea/vcs.xml fatal: Unable to mark file .idea/vcs.xml $ cd .idea git update-index --assume-unchanged .Đã làm việc, cảm ơn!
AVProgrammer 23/2/2016

4

Nếu đường dẫn của bạn có khoảng trắng, bạn có thể gặp lỗi này ngay cả khi bạn có vỏ đúng.

Điều này dẫn đến lỗi "nghiêm trọng":

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

Để sửa nó, chỉ cần thêm dấu ngoặc kép xung quanh đường dẫn.

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

Trong trường hợp của tôi, tôi đã có / ngược.
Erik Bergstedt

4

Vấn đề của tôi là, tôi đã thử lệnh với ký tự đại diện * giả sử rằng nó sẽ được đệ quy, nhưng không được.

Vì vậy, những gì tôi đã làm là

$ 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

thi hành

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

làm việc cho tôi sau đó và không dẫn đến OP và vấn đề của tôi.


4

Tôi gặp vấn đề này khi tôi cố gắng giải nén các tệp * .orig.

Đây là những gì tôi đã làm để mở khóa chúng:

$git reset -- *.orig

nếu điều đó không làm việc:

$git clean -fd

5
Thật nguy hiểm khi yêu cầu mọi người thực thi lệnh mà không nói với họ rằng lệnh này sẽ xóa các tệp. $ git sạch -fd
HS Rathore

4

Hãy chắc chắn rằng tệp được thêm vào git repo, nếu không thêm tệp trong git repo và sau đó thử nó sẽ hoạt động.


3

--assume-unchangedlà về các hệ thống tệp chậm và người dùng hứa rằng Git không cần kiểm tra tệp này, vì Git có thể cho rằng nó không thay đổi. Nhưng một số lệnh vẫn kiểm tra và tạo ra 'bất ngờ'!

Không sử dụng trên các tập tin thay đổi.

Xin lỗi để trở thành người đưa tin đó (tôi có một bản vá trong quá trình thay đổi tài liệu đó).


1
Vậy thì làm thế nào để cập nhật một tập tin để đánh dấu nó là 'không theo dõi tôi'?
javadba

@javadba xem stackoverflow.com/a/6964492/717355 'git rm - tên tệp đã được chỉnh sửa'
Philip Oakley

thx - được đánh giá cao về điều đó: tôi thực sự đã sử dụng nó ngay sau khi đăng ở đây. làm.
javadba

lưu ý rằng git rm --cached filenamesẽ xóa tệp khi người khác kéo
Ryan Taylor

@RyanTaylor có, điều quan trọng là người dùng phải nhận ra lệnh của họ đang nói gì, đó là 'dừng theo dõi điều này, xóa nó khỏi bản sửa đổi của tôi'. Hãy đọc quan điểm mới nhất về người bảo trì và bản vá mới của tôi .. public-inbox.org/git/20161101210448.4692-1-philipoakley@iee.org/
Philip Oakley

3

Trong trường hợp của tôi, tôi đã cố gắng sử dụng bất kỳ phương pháp nào ở trên, nhưng không gặp may.

Sau nhiều lần thử, tôi chỉ nghĩ sẽ thêm tệp của mình vào mục lục.

git add myfile.php

Git đã từ chối hành động này nhưng anh ấy khuyên tôi nên thực hiện nó một cách ép buộc.

git add myfile.php -f

Và điều đó đã làm việc cho tôi.


2

Đảm bảo bạn đã đăng ký "web.config".

Nếu không, bạn sẽ nhận được thông báo lỗi này.


1

Có lẽ hữu ích cho một ai đó. Tôi có cùng một vấn đề và không có vấn đề cú pháp, không có tên với khoảng trắng, không có vấn đề về đường dẫn và lệnh git reset không hoạt động. Tôi đã cam kết từ một thư mục bên trong apache www và dịch vụ apache đã bị dừng. Bắt đầu lại dịch vụ apache và lỗi không còn nữa


1

Một lỗi phổ biến xung quanh việc sử dụng lệnh này là cố gắng giả sử tệp không được theo dõi hoặc tệp bị bỏ qua bởi git.

Trước tiên hãy chắc chắn rằng tệp được theo dõi bằng cách chạy

git ls-files | grep relative_path/to/file

Nếu nó không hiển thị tệp của bạn, thì bạn cần thêm nó trước:

git add relative_path/to/file

Nếu điều này hiển thị tệp của bạn hoặc bạn đã thêm tệp đó vào git, thì bạn sẽ có thể chạy các lệnh giả định git bình thường:

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

hoặc cho các thư mục

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

bạn có thể kiểm tra xem tập tin của bạn có bị bỏ qua hay không bằng cách chạy

git ls-files -v | grep ^S

Ký tự S đại diện cho các tập tin bị bỏ qua.


0

Đối với tất cả du khách trong tương lai. Không có điều nào ở trên giải quyết vấn đề của tôi. Những gì tôi nhận ra là các .gitignoretập tin phải được đặt trong thư mục bên phải. Trong trường hợp của tôi, một khi tôi chuyển .gitignoređến thư mục gốc của ứng dụng thì vấn đề đã được giải quyết.


0

Kiểm tra xem tệp được đánh dấu có tồn tại và đánh vần chính xác hay không, đặc biệt là đường dẫn tệp và dấu tách tệp. Các phân tách tệp của hệ thống windows và hệ thống linux theo các hướng khác nhau.


1
Mặc dù không sai, câu trả lời này không thực sự thêm bất cứ điều gì vào câu hỏi. Tất cả các đề xuất của bạn đã được đưa ra trong câu trả lời hiện có.
Matt

0

Tôi thấy rằng đôi khi điều này không hoạt động vì bạn đã cam kết tệp với .gitignore của bạn và thực hiện đẩy hoặc kéo. Bạn chỉ cần thực hiện việc đẩy và tệp của bạn sẽ bị bỏ qua trong các lần xác nhận tiếp theo ngay cả khi bạn sửa đổi tệp cục bộ.


0

Tôi đã có cùng một vấn đề với cygwin trong windows. Đưa đường dẫn tập tin đầy đủ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.