git update-index --assume-неизмененный возвращает «фатальный невозможно пометить файл»


133

У меня та же проблема, что и у ОП в этом посте, но я не понимаю ответ, помеченный как правильный (не вижу, чтобы он объяснял, как исправить ситуацию)

Я делаю это и получаю эту ошибку:

$ git update-index --assume-unchanged web.config
fatal: Unable to mark file web.config
  1. Файл добавлен в хранилище

  2. Это не в .git/info/exclude

  3. Это не в .gitignore(это было, но я вынул его, затем принудительно добавил web.config git add -f web.config, зафиксировал и отправил эти изменения в репозиторий)

  4. Когда я делаю Git ls-files -o, его там нет

Так что я могу сделать, чтобы исправить?


1
перечитайте принятый ответ в указанном вопросе: он НЕ должен появляться в результатах git ls-files -o. Если так, то его нет в репо.
— Eckes

моя опечатка, это НЕ в списке, и это наиболее определенно в репо
— Карен

Ответы:


108

У меня была та же проблема, что и у вас, и я выполнил те же четыре шага, которые вы указали выше, и получил те же результаты. Это включало тот факт, что мой файл был указан при выполнении git ls-files -o. Однако в моем случае я также попытался выполнить git update-index --assume-unchangedфайл, который не был указан при выполнении ls-files -o, и я все еще получил ту же ошибку " fatal: Unable to mark file".

Я подумал, что, возможно, это ошибка, и скачал последнюю версию git, но это не помогло.

Я наконец понял, что эта команда чувствительна к регистру! Это включает в себя полный путь и имя файла. После обновления пути к каталогу, чтобы полный путь был указан в правильном регистре, команда выполнена правильно.

Обратите внимание, что это было с Git для Windows, поэтому ваши результаты могут отличаться в зависимости от других платформ.


4
Большое спасибо SOOOO! Это сработало! Я думаю, что я использовал все строчные буквы, или компакт-диск в папку, а затем попытался использовать эту команду.
— Карен

Если файл изменится, то это неправильно. Команда дает Git обещание, что ей не нужно тратить циклы на указание файла, чтобы определить, изменился ли он (для медленных файловых систем ;-). В конце концов одна из команд Git заметит, и вы будете удивлены. Документация обновляется, чтобы прояснить это.
— Филип Окли

1
Спасибо, это косвенно помогло мне обнаружить плохой сценарий оболочки в проекте. Если путь не существует, это не удастся! :)
— учуугака

Также обратите внимание, что эта команда не будет работать для неверсированных файлов. Если у вас есть файл, которого нет в хранилище, его можно проигнорировать в .gitignore, и я чувствую себя глупо, если набираю это, но думаю, что это может помочь кому-то столь же глупому, как я. :)
— Джесси Айви

Просто чтобы уточнить, на что намекают некоторые комментарии, если вы используете оболочку 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, и ни один из предложенных обходных путей не помог мне. Любая идея? Я пытаюсь временно приостановить отслеживание каталога только на моей машине, имя каталога - intellij_idea_project_files /. Очевидно, что все файлы в этом каталоге были правильно помечены, кроме одного, и это my_project_name.iml.
— Джавад Садекзаде,

1
У меня была та же проблема, и это решение работало для меня, а не с учетом регистра
— CesarPim

Я тоже на Mac и для меня «решением» было удалить файл. (Я бы опубликовал это как ответ, но я не уверен, что случилось, может быть, позже.) Произошло что-то странное. Git говорил, что файл был изменен (я хотел --skip-worktree). Я избавился от локальных изменений, запустив, git restore .но пропустить все равно дал ошибку. Наконец я попытался удалить файл. Шокирующе, мерзавец не сказал, что произошли изменения. Совершенно очевидно, что произошло нечто странное, так как git определенно отслеживал это, и я определенно удалил это, и это определенно не говорило, что это изменение.
— Капитан Мэн

25

В моем случае дерево, которое я отмечал, было каталогом, а не файлом, как в вашем случае, и мне не хватало косой черты после его имени.

Неправильно -

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

Верный -

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

Обратите внимание на косую черту (/) в конце.


1
Спасибо, но когда я делаю это, я получаю «Игнорирование пути имя-каталога /»
— Дамиан

@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"

В моем случае я имел / назад.
— Эрик Бергштедт

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/*

работал для меня тогда и не привел к ОП и моей проблеме.


4

У меня была эта проблема, когда я пытался распаковать файлы * .orig.

Вот что я сделал, чтобы отследить их:

$git reset -- *.orig

если это не сработает:

$git clean -fd

5
Опасно просить людей выполнить команду, не сообщая им, что эта команда удалит файлы. $ git clean -fd
— HS

4

Убедитесь, что файл добавлен в git repo, если не добавляете файл в git repo, а затем попробуйте, он будет работать.


3

--assume-unchangedо медленных файловых системах, и пользователи обещают, что Git не нужно проверять этот файл, поскольку Git может предположить, что он не изменился. Но некоторые команды все же проверяют и выдают «сюрприз»!

Не используйте на файлы, которые меняются.

Извините, что принес эти новости (у меня есть патч в процессе изменения этой документации).


1
Тогда как можно обновить файл, чтобы пометить его как «не отслеживать меня»?
— javadba

@javadba см. stackoverflow.com/a/6964492/717355 'git rm --cached filename'
— Филип Окли

спасибо - проголосовали за это: я фактически использовал его сразу после публикации здесь. работает.
— javadba

обратите внимание, что git rm --cached filenameфайл будет удален, когда другие будут извлекать данные
— Райан Тейлор

@RyanTaylor: да, пользователям важно понимать, что говорит их команда, а именно: «Прекратите отслеживать это, удалите это из моих версий». Ознакомьтесь
— 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 accept:

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
Хотя это и не ошибочно, этот ответ на самом деле ничего не добавляет к вопросу. Все ваши предложения уже включены в существующие ответы.
— Мэтт

0

Я обнаружил, что иногда это не работает, потому что вы уже передали файл в свой .gitignore и сделали push или pull. Вам нужно только сделать push, и ваш файл должен игнорироваться при последующих фиксациях, даже если вы локально изменяете файл.


0

У меня была такая же проблема с cygwin в Windows. Предоставление полного пути к файлу

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.