Полностью удалите файлы из Git repo и remote на GitHub

я случайно добавил папку с изображениями и зафиксировал. Затем я взял на себя еще одно обязательство. Затем я удалил эти файлы, используя git rm -f ./images и снова совершил.

прямо сейчас я сделал намного больше коммитов в этой ветке (master). В моей голове этого нет!--1--> папка.

из-за этого мой размер РЕПО значительно увеличился. Как я могу удалить эти капли полностью? И я хочу удалить его из моего удаленного репозитория GitHub.

3 ответов


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

git filter-branch --index-filter \
'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

кроме того, чтобы удалить все удаленные файлы из кэшей, созданных git, используйте:

rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune

вы можете найти более подробную информацию о последней команды, а также скрипт, который делает все, что вы хотите в одном действии, здесь: git: навсегда удалить файлы или папки из история.

другие ссылки с большим количеством объяснений:удалить конфиденциальные данные.

[Edit] Также см. Этот вопрос StackOverflow:удалить конфиденциальные файлы и их фиксации из истории Git.

(команды копировать из natacadoответ в вопросе, связанном выше.) Если вы уже удалили файлы из рабочей копии, следующее должно работать. Узнайте хэш для фиксации, которая добавила ненужных файлов. Тогда сделай:

git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force

вы можете просто перебазировать всю ветку и удалить как фиксацию, которая добавила изображения, так и фиксацию, которая их удалила.

git rebase -i master

вам будет представлен список коммитов. Удалите строки, в которых есть изгои, которые вы хотите удалить. ("ДД" удаляет строку в Vim редакторе по умолчанию. Тогда сохранить с ZZ)

болтающиеся коммиты затем будут очищены в ходе естественной сборки мусора git, процесс, который вы можете принудительно выполнить с помощью данной команды в ответ Darhuuk по.

Edit: это будет работать, даже если вы нажали на удаленный репозиторий, но вам придется нажать с --force. (То же самое относится и к решению git filter-branch).

обратите внимание, что это будет очень раздражать всех, кто вытащил из вашей ветки. Они должны проконсультироваться "восстановление из апстрима перебазировать".


предположительно, ваше первоначальное случайное добавление изображений является частью фиксации, которую вы хотите сохранить. В этом в случае, вам нужно отредактировать фиксацию во время перебаза, чтобы разделить части, которые вы хотите сохранить. Вы можете сделать это, заменив "pick" в списке "rebase-i" для этой фиксации на "e" (для редактирования). Процесс rebase остановится здесь, и вы можете разделить фиксацию с помощью "git commit --amend".


Я, по сути, повторяя ответ в сочетании с Windows форматирование предостережение, только чтобы он не терялся в качестве комментария.

обратите внимание на использование двойных кавычек вместо одинарных кавычек, потому что это зависит от оболочки, которую вы используете как строки обрабатываются.

Одну Строку:

git filter-branch --index-filter "git rm -r --cached --ignore-unmatch <file/dir>" HEAD

Несколько Строк:

git filter-branch --index-filter \
    "git rm -r --cached --ignore-unmatch <file/dir>" HEAD