git rm - fatal: pathspec не соответствует ни одному файлу
Я случайно добавил более 9000 фотографий в папку своего проекта. И совершил их. Затем удалил их с диска. Совершенные.
Теперь я пытаюсь внести изменения в git server. Но это занимает слишком много времени и пытается отправить 12 ГБ данных.
Я проверил размер файла на диске и вижу, что на самом деле .git
папка занимает 12 Гб.
Как удалить фотографии оттуда? Я старался git rm
, но не удается:
❯ git rm public/photos
fatal: pathspec 'public/photos' did not match any files
Потому что я уже удалил их с диска, но они все еще находятся в .git
папка.
Я пытался добавить public/photos
в .gitignore
:
public/photos/
*.zip
Но нет результата. Конечно мог hard reset head
в тот момент, когда у меня не было столько ненужных фотографий в моем проекте. Но с тех пор я много раз совершал и делал много изменений в коде.
13 ответов
В вашем случае используйте git filter-branch
вместоgit rm
,
git rm
удалит файлы в том смысле, что они больше не будут отслеживаться git, но это не удалит старые объекты коммитов, соответствующие этим изображениям, и поэтому вы все равно будете застревать с нажатием предыдущих коммитов, которые соответствуют 12 ГБ изображений.
git filter-branch
с другой стороны, можно также удалить эти файлы из всех предыдущих коммитов, избавляя от необходимости нажимать любой из них.
Используйте команду
git filter-branch --force --index-filter \ 'git rm -r --cached --ignore-unmatch public/photos' \ --prune-empty --tag-name-filter cat -- --all
После того как ветвь фильтра завершена, убедитесь, что не был потерян какой-либо непреднамеренный файл.
Теперь добавьте правило.gitignore
echo public/photos >> .gitignore git add .gitignore && git commit -m "ignore rule for photos"
Теперь сделай толчок
git push -f origin branch
Проверьте это, это и это для дальнейшей помощи. Чтобы быть в безопасности, я бы посоветовал вам создать резервную копию репозитория в вашей системе, прежде чем приступить к выполнению этих инструкций.
Что касается вашего сообщения об ошибке, это происходит потому, что вы уже отследили их, используяgit rm
и, следовательно, git жалуется, потому что не может удалить файл, который не отслеживает. Подробнее об этом читайте здесь.
Очень простой ответ.
Шаг 1:
Сначала добавьте ваши неотслеживаемые файлы, которые вы хотите удалить, используя git add .
или же git add <filename>
,
Шаг 2:
Затем легко удалите их, используя команду git rm -f <filename>
здесь rm= удалить и -f= принудительно.
Шаг 1
Добавьте имена файлов к вашему .gitignore
файл.
Шаг 2
git filter-branch --force --index-filter \
'git rm -r --cached --ignore-unmatch YOURFILE' \
--prune-empty --tag-name-filter cat -- --all
Шаг 3
git push -f origin branch
Большое спасибо @mu.
Чтобы удалить отслеженный и старый зафиксированный файл из git, вы можете использовать команду ниже. В моем случае я хочу отследить и удалить весь файл изdist
каталог.
git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch dist' --tag-name-filter cat -- --all
Затем вам нужно добавить его в свой .gitignore
так что это не будет отслеживаться дальше.
Использование этого сработало для меня
git rm -f --cached <filename>
Иногда это происходит, когда вы не отслеживаете свой файл, добавляйте его с помощью
git add untracked file name
, после этого просто сделайте
git rm -r file name
Это цепи работают в моем случае:
git rm -r WebApplication/packages
Было подтверждение git-диалога. Вы должны выбрать вариант "у".
git commit -m "blabla"
git push -f origin <ur_branch>
git stash
сделал работу, он восстановил файлы, которые я удалил, используя rm
вместо git rm
,
Я сделал сначала проверку последнего хэша, но я не верю, что это требуется.
У меня была аналогичная проблема со следующим сообщением об ошибке (Google привел меня сюда):
error: pathspec 'elements (conflicted copy 2013-08-06)' did not match any file(s) known to git
Я попробовал все описанные здесь решения, но ни одно из них мне не помогло. У меня было два файла, которых просто больше не было, но git все еще показывал мне файлы, и удалить их было невозможно. Они были созданы благодаря конфликту с Dropbox.
Шаги, которые сработали для меня:
-
git stash
В результате два файла снова появились в папке.
- переименуйте файлы во что-нибудь другое
Git теперь будет показывать переименованные файлы как неотслеживаемые, но старые файлы по-прежнему будут удалены.
Изменения, не подготовленные для фиксации: (используйте «git add/rm ...», чтобы обновить то, что будет зафиксировано) (используйте «git restre...», чтобы отменить изменения в рабочем каталоге) удалено: «
elements (конфликтная копия 2013-08) -06)"
удалено: "макет (конфликтная копия от 06 августа 2013 г.)"Неотслеживаемые файлы: (используйте «git add ...», чтобы включить в то, что будет зафиксировано)
elements_dupe
layout_dupe
-
git add -A
Внезапно отобразился статус git, что предыдущие файлы были переименованы.
Изменения, которые необходимо зафиксировать: (используйте «git restre --staged ...», чтобы отменить стадию)
переименовано: «elements (конфликтная копия 06 августа 2013 г.)» -> elements_dupe переименовано: «layout (конфликтная копия 6 августа 2013 г.)» -> Layout_dupe
-
git commit -m 'renamed duplicate files'
После этого их было очень легко удалить, просто удалив файлы и зафиксировав их снова.
Для справки, я заметил, что у меня есть файлы с разрешениями 000, возможно, они были созданы с помощью sudo, я не знаю, но после изменения ваших разрешений на 644 (мне понадобилось sudo для этой операции) проблема была решена
sudo chmod 644 vendor/symfony/yaml
и результат фиксации:
diff --git a/vendor/symfony/yaml b/vendor/symfony/yaml
deleted file mode 160000
index 212a27b7..00000000
--- a/vendor/symfony/yaml
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 212a27b731e5bfb735679d1ffaac82bd6a1dc996
diff --git a/vendor/symfony/yaml b/vendor/symfony/yaml
new file mode 100644
index 00000000..20a0b9d0
--- /dev/null
+++ b/vendor/symfony/yaml
@@ -0,0 +1 @@
+Subproject commit 212a27b731e5bfb735679d1ffaac82bd6a1dc996
Я получил ту же ошибку, когда хотел удалить кешnode_modules
реж.
вместо
git rm -r -f --cached node_modules
я должен был использовать
git rm -r -f --cached **/node_modules
, потому что каталог не был частью корневого каталога.
У меня возникла эта ошибка, когда я прервал загрузку, которая занимала слишком много времени. Чтобы исправить ее, я переименовал файл, зафиксировал, переименовал его обратно, зафиксировал.
У меня был дублированный каталог (~web/web), и он удалил вложенный дубликат, когда я запустил rm -rf web
находясь внутри первой веб-папки.