git rm - кэшированный и фатальный: pathspec

Я просто попытался оформить свою основную ветку и наткнулся на:

error: Untracked working tree file 'app.xcodeproj/project.xcworkspace/xcuserdata/u.xcuserdatad/UserInterfaceState.xcuserstate' would be overwritten by merge. 

Итак, я попытался удалить этот файл из git (я уже добавил выражение в.gitignore, чтобы перехватить его), используя:

git rm --cached app.xcodeproj/project.xcworkspace/xcuserdata/u.xcuserdatad/UserInterfaceState.xcuserstate

и получил:

fatal: pathspec 'app.xcodeproj/project.xcworkspace/xcuserdata/u.xcuserdatad/UserInterfaceState.xcuserstate' did not match any files 

Таким образом, с небольшим убытком. Насколько я понимаю, рабочий файл не проблема здесь. Однако, для полноты, рабочий файл существует. Например

ls -l app.xcodeproj/project.xcworkspace/xcuserdata/u.xcuserdatad/UserInterfaceState.xcuserstate
-rw-r--r--  1 u  u  56061 24 Sep 12:42 app.xcodeproj/project.xcworkspace/xcuserdata/u.xcuserdatad/UserInterfaceState.xcuserstate

5 ответов

Решение

Итак, решение таково:

Файл не отслеживается в этой текущей ветви B

Но он существует в ветви, которую мы пытаемся получить, ветка A, поэтому мы получаем предупреждение о том, что файл в нашем текущем рабочем дереве будет перезаписан (даже если мы его не отслеживаем)

Так:

  1. удалите файл в вашем существующем каталоге (я просто переместил его куда-то из рабочего дерева изначально для безопасности) ветви B

  2. отметьте нужную вам ветку - т.е. ветку А

  3. Удалите его из ветви A, используя что-то вроде этого:

    git rm - кэшированный app.xcodeproj/project.xcworkspace/xcuserdata/u.xcuserdatad/UserInterfaceState.xcuserstate

Примечание: Fwiw, Branch A был моим основным филиалом. Ветвь Б была моей веткой разработчика.

Для проблемы в названии вопроса вы можете решить ее следующим образом:

git rm --cached *

fatal: pathspec 'blah' did not match any files 

git ls-files

В нем будут перечислены файлы, которые git имеет в своем индексе, и вы можете затем явно удалить их один за другим. Если, например, это перечисляет img/blah.jpg:

git rm --cached img/blah.jpg

Это решит ошибку спецификации пути в более общем случае, будь то проблема с ветвлением, как это было в другом ответе здесь, или новая запись.gitignore, или результат использования 2 репо в одном и том же каталоге и т. Д.

Просто:

git add file.ext
git rm --cached file.ext

или же

git add path/*
git rm --cached path/*

Попробуйте флаг --ignore-unmatch

Я получал ту же ошибку при попытке отменить отслеживание некоторых файлов, которые уже отслеживаются Git, с помощью совпадения с подстановочными знаками, и, поскольку некоторые из них, похоже, не выходят, я получал ошибку, что файл не соответствует, и это приводило к сбою всей операции. Итак, я проверил руководство и попробовал флаг --ignore-unmatch , и это сработало как шарм:

$ git rm --cached --ignore-unmatch cron/*.json

Если ваши файлы получены из предыдущих коммитов, вам необходимо удалить все файлы из предыдущих коммитов.

      git filter-branch --force --index-filter \
  'git rm -r --cached --ignore-unmatch PATH_TO_FILES_TO_REMOVE' \
  --prune-empty --tag-name-filter cat -- --all
Другие вопросы по тегам