git update-index --assume-unchanged повертає "фатальний не в змозі позначити файл"


133

У мене є та сама проблема, що і в ОП цій посаді, але я не розумію відповідь, позначену як правильну (я не бачу, що це пояснює, як виправити ситуацію)

Я роблю це і отримую цю помилку:

$ 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 , , і змінив ці зміни до репо)

  4. Коли я роблю Git ls-файли, - це НЕ

То що я можу зробити, щоб виправити?


1
перечитайте прийняту відповідь у згаданому запитанні: вона НЕ відображатиметься у висновку git ls-files -o. Якщо так, то це не в репо.
eckes

мій друк, його НЕ в списку, і це найбільш точно в репо
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 помітить, і ви здивуєтеся. Документація оновлюється для уточнення цього.
Філіп Оуклі

1
Дякую, це опосередковано допомогло мені виявити якийсь поганий сценарій оболонки в проекті. Якщо шлях не існує, це не вдасться! :)
uchuugaka

Також зауважте, що ця команда не працюватиме для неперевершених файлів. Якщо у вас є файл, який не існує в сховищі, його можна ігнорувати в .gitignore, і хлопчик, чи я відчуваю себе дурним, набираючи це, але я вважаю, що це може допомогти комусь так само німим, як я. :)
Джессі Айві

Просто для уточнення того, на що натякали деякі коментарі, якщо ви використовуєте оболонку Windows, яка дозволила вам відійти від невідповідностей регістрів у ваших CD, ви отримаєте цю помилку. Або дайте 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.
Джавад Садекзаде

1
була така ж проблема, і це рішення, яке працювало для мене, а не те, що стосується регістру
CesarPim,

Я також на Mac, і для мене "рішенням" було видалити файл. (Я опублікував би це як відповідь, але я не впевнений, що сталося, можливо, пізніше.) Щось дивне сталося. Гіт сказав, що файл змінено (я хотів --skip-worktree). Я позбувся локальних змін, запустивши, git restore .але пропуск все-таки видав помилку. Нарешті я спробував видалити файл. Шокуюче, git не сказав, що є зміни. Так чітко трапилося щось фанкі, оскільки git його точно відстежував, і я його точно видалив, і він точно не сказав, що це була зміна.
Капітан Людина

25

У моєму випадку дерево, яке я позначав, було каталогом, а не файлом, як у вашому випадку, і я пропустив косую косу рису після її імені.

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

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

Правильно -

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

Зверніть увагу на пряму косу рису (/) наприкінці.


1
Дякую, але коли я це роблю, я отримую "Ігнорування каталогу-ім'я шляху /"
damian

@damian Вкажіть повний шлях до файлу замість батьківського каталогу.
Нахід

6

fatal: Не вдається позначити файл 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

Моя проблема полягала в тому, що я спробував команду з * wildcard, припускаючи, що це буде рекурсивно, але це не так.

Так що я і робив

$ 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 'мерзотник гт --cached имя_файла'
Philip Oakley

THX - прихильник цього: я насправді використовував його відразу після публікації тут. працює.
javadba

зауважте, що git rm --cached filename файл буде видалено, коли інші потягнуть
Райан Тейлор

@RyanTaylor так, для користувачів важливо усвідомити, про що говорить їх команда, а це "припиніть відстежувати це, видаліть його з моїх змін". Прочитайте останню інформацію про технічне
Філіп Оуклі

3

У моєму випадку я намагався використати будь-який із наведених вище способів, але не пощастило.

Після багатьох спроб я просто подумав додати свій файл до індексу.

git add myfile.php

Гіт відмовився від цієї дії, але він порадив мені зробити це насильно.

git add myfile.php -f

І це працювало на мене.


2

Переконайтеся, що у вас зареєстровано "web.config".

Якщо це не так, ви отримаєте це повідомлення про помилку.


1

Можливо, комусь корисно. У мене була така ж проблема, і це не було проблеми з синтаксисом, жодної назви з пробілами, жодної проблеми шляху та команди скидання git не працювали. Я здійснював посилання з папки всередині 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
Хоча і не помиляється, ця відповідь насправді нічого не додає до питання. Усі ваші пропозиції вже викладені в існуючих відповідях.
Метт

0

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


0

У мене була така сама проблема із cygwin у Windows. Надання повного шляху до файлу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.