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, поэтому мы получаем предупреждение о том, что файл в нашем текущем рабочем дереве будет перезаписан (даже если мы его не отслеживаем)
Так:
удалите файл в вашем существующем каталоге (я просто переместил его куда-то из рабочего дерева изначально для безопасности) ветви B
отметьте нужную вам ветку - т.е. ветку А
Удалите его из ветви 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