Інструмент git filter-repo
та BFG Repo-Cleaner перезаписують журнал репозиторію, що змінює агентів здоров'я SYSTEM для існуючих фіксацій, які ви змінюєте, та всіх залежних фіксацій. Змінені агенти охорони здоров'я фіксації можуть впливати на відкриті запити на витягування у сховищі. Перед видаленням файлів зі сховища рекомендується об'єднати або закрити всі відкриті pull requests.
Ви можете видалити файл з останнього фіксу за допомогою git rm
файлу останнього фіксації для отримання інформації про видалення файлу, доданого з останнім комітом, див. Про великі файли на GitHub.
Попередження. У цій статті описано, як зробити фіксацію конфіденційних даних недоступною з будь-яких гілок або тегів у сховищі в GitHub.com. Однак ці фіксації все ще можуть бути доступні в будь-яких клонах або форках сховищ безпосередньо через хеші SHA-1 у кешованих переглядах у GitHub, а також через будь-які pull-запити, що посилаються на них. Ви не можете видалити конфіденційні дані з клонів сховища інших користувачів, але ви можете назавжди видалити кешовані перегляди та посилання на конфіденційні дані в pull requests на GitHub, звернувшись до служби підтримки GitHub.
Якщо фікс, який ввів конфіденційні дані, існує в будь-якому репозиторії, він все одно буде доступний, якщо власник форка не видалить конфіденційні дані з форка або не видалить форк повністю.
Після надсилання фіксації на GitHub будь-які конфіденційні дані в коміті повинні розглядатися як скомпрометовані. Якщо пароль виправлено, його потрібно змінити. Якщо ви виправили ключ, створіть новий ключ. Видалення скомпрометованих даних не усуває початкову вразливість, особливо в існуючих клонах або відгалуженнях сховищ.
Враховуйте ці обмеження, вирішуючи перезаписати журнал репозиторію.
Очищення файлу з журналу сховища
Ви можете очистити файл з журналу репозиторію за допомогою інструменту або інструменту git filter-repo
BFG Repo-Cleaner з відкритим вихідним кодом.
Використання BFG BFG
Repo-Cleaner - це інструмент, створений і підтримуваний спільнотою з відкритим вихідним кодом. Це швидша та простіша альтернатива git filter-repo
для видалення небажаних даних.
Щоб видалити файл з конфіденційними даними та залишити останній фікс незмінним, запустіть таку команду:Використання git filter-repo
$ bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA
Чтобы заменить все вхождения текста, представленного в passwords.txt
, в журнале репозитория, выполните:
$ bfg --replace-text passwords.txt
После удаления конфиденциальных данных необходимо принудительно отправить изменения в GitHub. В этом случае выполняется перезапись журнала репозитория, в результате которой конфиденциальные данные удаляются из журнала фиксации. При принудительной отправке могут быть перезаписаны фиксации, над которыми работают другие пользователи.
$ git push --force
Полные инструкции по использованию и загрузке см. в документации по BFG Repo-Cleaner.
Важливо! Якщо ви виконали після того, як приховали git filter-repo
зміни, ви не зможете відновити зміни за допомогою інших команд, щоб приховати. Перед виконаннямgit filter-repo
рекомендується показати всі внесені зміни. Щоб показати останній набір прихованих змін, запустіть команду
git stash show -p | git apply -R
. Для отримання додаткової інформації дивіться Git Tools - Приховування та очищення.
Щоб продемонструвати, як це працюєgit filter-repo
, ми покажемо вам, як видалити файл конфіденційних даних із журналу сховища, додати його та.gitignore
переконатися, що його випадково не було повторно надіслано.
-
Встановіть останню версію інструменту git filter-repo. Інсталяцію можна виконати
git-filter-repo
вручну або за допомогою диспетчера пакетів. Наприклад, щоб встановити інструмент за допомогою HomeBrew, скористайтеся командоюbrew install
.brew install git-filter-repo
Дополнительные сведения см. в файле INSTALL.md в репозитории
newren/git-filter-repo
. -
Якщо у вас ще немає локальної копії сховища з конфіденційними даними в журналі, клонуйте сховище на локальному комп'ютері.
$ git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY > Initialized empty Git repository in /Users/YOUR-FILE-PATH/YOUR-REPOSITORY/.git/ > remote: Counting objects: 1301, done. > remote: Compressing objects: 100% (769/769), done. > remote: Total 1301 (delta 724), reused 910 (delta 522) > Receiving objects: 100% (1301/1301), 164.39 KiB, done. > Resolving deltas: 100% (724/724), done.
-
Перейдите в рабочую папку репозитория.
$ cd YOUR-REPOSITORY
-
Выполните следующую команду, заменив
PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA
путем к файлу, который необходимо удалить, а не только именем файла. Эти аргументы:- Змусьте Git обробити, але не витягти, весь журнал кожної гілки та тега.
- Видаліть вказаний файл, а також будь-які порожні фіксації, створені в результаті.
- Видаліть деякі конфігурації, наприклад віддалену URL-адресу, що зберігається у файлі . git/config. Можливо, вам доведеться заздалегідь створити резервну копію цього файлу для подальшого відновлення.
-
Перезапис наявних тегів
$ git filter-repo --invert-paths --path PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA Parsed 197 commits New history written in 0.11 seconds; now repacking/cleaning... Repacking your repo and cleaning out old unneeded objects Enumerating objects: 210, done. Counting objects: 100% (210/210), done. Delta compression using up to 12 threads Compressing objects: 100% (127/127), done. Writing objects: 100% (210/210), done. Building bitmaps: 100% (48/48), done. Total 210 (delta 98), reused 144 (delta 75), pack-reused 0 Completely finished after 0.64 seconds.
Примітка. Якщо файл конфіденційних даних існував іншими шляхами (внаслідок переміщення або перейменування), цю команду також потрібно виконати за цими шляхами.
-
Додайте файл конфіденційних даних, щоб
.gitignore
запобігти випадковому здійсненню.$ echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore $ git add .gitignore $ git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore" > [main 051452f] Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore > 1 files changed, 1 insertions(+), 0 deletions(-)
-
Внимательно проверьте, удалили ли вы все, что требуется, из журнала репозитория и все ли ветви извлечены.
-
Коли вас влаштовує стан репозиторію, підштовхніть локальні зміни, щоб перезаписати репозиторій в GitHub.com, а також у всіх гілках, які ви додали. Видалення конфіденційних даних із журналу фіксації вимагає натискання.
$ git push origin --force --all > Counting objects: 1074, done. > Delta compression using 2 threads. > Compressing objects: 100% (677/677), done. > Writing objects: 100% (1058/1058), 148.85 KiB, done. > Total 1058 (delta 590), reused 602 (delta 378) > To https://github.com/YOUR-USERNAME.YOUR-REPOSITORY.git > + 48dc599...051452f main -> main (forced update)
-
Чтобы удалить конфиденциальный файл из выпусков с тегами, потребуется также выполнить принудительную отправку в теги Git:
$ git push origin --force --tags > Counting objects: 321, done. > Delta compression using up to 8 threads. > Compressing objects: 100% (166/166), done. > Writing objects: 100% (321/321), 331.74 KiB | 0 bytes/s, done. > Total 321 (delta 124), reused 269 (delta 108) > To https://github.com/YOUR-USERNAME/YOUR-REPOSITORY.git > + 48dc599...051452f main -> main (forced update)
Полное удаление данных с сайта GitHub
Після видалення конфіденційних даних за допомогою інструмента BFG або git filter-repo
надсилання змін на GitHub є кілька речей, які потрібно зробити, щоб повністю видалити дані з GitHub.
-
Зверніться до служби підтримки GitHub, щоб видалити кешовані перегляди та посилання на конфіденційні дані в pull requests на GitHub . Вкажіть ім'я репозиторію та/або посилання на коміт, необхідне для видалення.
-
Повідомте співавторів про переміщення змін з однієї гілки в іншу і не об'єднуйте гілки, створені зі старого (пошкодженого) журналу сховища. Один коміт злиття може повернути деякі або всі пошкоджені журнали, які щойно потрібно було очистити.
-
Через деякий час, коли ви переконаєтеся, що в інструменті BFG не
git filter-repo
було непередбачених побічних ефектів, ви можете примусово видалити посилання на всі об'єкти в локальному сховищі та зібрати сміття за допомогою наступних команд (у Git 1.8.5 або пізнішої версії):$ git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin $ git reflog expire --expire=now --all $ git gc --prune=now > Counting objects: 2437, done. > Delta compression using up to 4 threads. > Compressing objects: 100% (1378/1378), done. > Writing objects: 100% (2437/2437), done. > Total 2437 (delta 1461), reused 1802 (delta 1048)
Примечание: Для этого можно также отправить отфильтрованный журнал в новый или пустой репозиторий, а затем сделать новый клон из GitHub.
Запобігання випадковим фіксаціям у майбутньому
Є кілька простих прийомів, щоб уникнути фіксації даних, які ви не хочете фіксувати:
- Використовуйте візуальну програму, таку як GitHub Desktop або gitk, для фіксації змін. Як правило, візуальні програми полегшують перегляд файлів, які будуть додаватися, видалятися і змінюватися при кожному фіксуванні.
- Уникайте використання команд catch-all
git add .
в командному рядку і — використовуйтеgit add filename
іgit commit -a
git rm filename
готуйте кожен файл окремо. - Використовуйте
git add --interactive
для перевірки та підготовки кожної окремої зміни в кожному файлі. - Використовуйте для перевірки змін, підготовлених до фіксації. Це
git diff --cached
точна невідповідність, яка буде виникати до тих пір,git commit
поки ви не використовуєте файл .-a