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

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

Прямо сейчас, я сделал намного больше коммитов в этой ветке (мастер). В моей HEAD у меня нет этой папки ./static/images.

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

Ответ 1

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

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

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

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

[Изменить] Также см. этот вопрос в 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

Ответ 2

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

git rebase -i master

Вам будет представлен список коммитов. Удалите строки, у которых есть ошибка, которую вы хотите удалить. ( "dd" удаляет строку в vim, редактор по умолчанию, а затем сохраняет с ZZ)

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

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

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


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

Ответ 3

Я по существу повторяю ответ в сочетании с этим предупреждением о форматировании Windows, только так, t теряется как комментарий.

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

Одиночная линия:

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