Удаление файла из истории git навсегда - PullRequest
1 голос
/ 30 сентября 2019

Допустим, я сделал 5 коммитов в своем git-проекте.

На коммите 4 я случайно добавил свой файл credentials.json и подтолкнул к репо.
На коммите 5 я удалил файл, сделал коммит и отправил это изменение в репо.

В настоящее время файл не отображается в последнем коммите. Но если пользователь проверяет историю коммитов, он может перейти к коммиту 4 и проверить содержимое моего файла.

Как я могу навсегда удалить файл из истории коммитов, чтобы он выглядел так, как будто файл никогда не был добавлен вrepo.

Примечание: -
Я уже попробовал следующую команду: -

git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch Credentials.json" \
  --prune-empty --tag-name-filter cat -- --all

Не выдает никакой ошибки, но файл не удаляется изИстория.

На самом деле файл находится в папке / src. Но странно то, что когда я даю следующую команду (включая полный путь): -

git filter-branch --force --index-filter   "git rm --cached --ignore-unmatch ~full-path/src/Credentials.json"   --prune-empty --tag-name-filter cat -- --all

я получаю сообщение об ошибке: - ~ полный путь / src / Credentials.json находится вне репозитория.

Это потому, что я уже удалил свой файл в коммите 5? Что я могу сделать в этом сценарии?
Является ли создание нового репо с нуля единственным вариантом?

Ответы [ 3 ]

2 голосов
/ 30 сентября 2019

Если никто не клонировал репозиторий, вы можете использовать git rebase -i, чтобы переписать историю и удалить файл.

Использовать git rebase -i <commit-hash-of-commit-3>. Откроется редактор со списком коммитов, начиная с коммита-4. Вы можете удалить коммит (удалив строку и сохранив файл), отредактировать его и т. Д.

Выберите «редактировать» для коммита-4. Сохраните файл. Вы вернетесь к оболочке с файлами, добавленными в git 'index', но еще не зафиксированными.

Теперь вы можете git rm credentials.json удалить файл и git commit --amend, чтобы изменить коммит. ( обновлено )

Наконец git rebase --continue до конца. Вы вернетесь к оболочке, и файл больше не будет частью репозитория.

Если позднее вы добавили коммит, который зависит от файла Credentials.json, вы можете получить ошибку во времяфаза продолженияЗатем Git останавливается на проблемном коммите, и вы снова можете использовать команды git (сброс / добавление), чтобы изменить коммит и продолжить.

1 голос
/ 30 сентября 2019

Нет необходимости создавать новый репо. git filter-branch работает.

Не используйте полный путь в git filter-branch, используйте относительный путь src/Credentials.json.

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch src/Credentials.json" --prune-empty --tag-name-filter cat -- --all

BTW, bfgгораздо проще в использовании для новичка. (bfg принимает имя файла без пути.)

bfg --delete-files Credentials.json

Ссылки

0 голосов
/ 30 сентября 2019

Я бы рекомендовал прочитать Страница справки GitHubs :

Вкратце:

  • Вы можете использовать BFG Repo-Cleaner

    bfg --delete-files Credentials.json my-repo.git

  • Вы можете использовать git filter-branch:

    git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" --prune-empty --tag-name-filter cat -- --all
    (где путь, например, src/Credentials.json, Это может вам тоже помочь )

Стоит отметить, что, если у кого-то уже есть копия репо, вы должны удалить ее и там! (или вы заставляете переклонировать / вытащить репо)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...