• Час читання ~2 хв
  • 10.04.2023

Коли ви передаєте конфіденційні дані, такі як пароль або ключ SSH, до сховища Git, ви можете видалити їх із журналу. Щоб повністю видалити непотрібні файли з журналу сховища, ви можете скористатися інструментом git filter-repo або інструментом BFG Repo-Cleaner з відкритим вихідним кодом.

Інструмент 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 переконатися, що його випадково не було повторно надіслано.

  1. Встановіть останню версію інструменту git filter-repo. Інсталяцію можна виконати git-filter-repo вручну або за допомогою диспетчера пакетів. Наприклад, щоб встановити інструмент за допомогою HomeBrew, скористайтеся командою brew install.

    brew install git-filter-repo
    

    Дополнительные сведения см. в файле INSTALL.md в репозитории newren/git-filter-repo.

  2. Якщо у вас ще немає локальної копії сховища з конфіденційними даними в журналі, клонуйте сховище на локальному комп'ютері.

    $ 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.
  3. Перейдите в рабочую папку репозитория.

    $ cd YOUR-REPOSITORY
  4. Выполните следующую команду, заменив 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.

    Примітка. Якщо файл конфіденційних даних існував іншими шляхами (внаслідок переміщення або перейменування), цю команду також потрібно виконати за цими шляхами.

  5. Додайте файл конфіденційних даних, щоб .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(-)
  6. Внимательно проверьте, удалили ли вы все, что требуется, из журнала репозитория и все ли ветви извлечены.

  7. Коли вас влаштовує стан репозиторію, підштовхніть локальні зміни, щоб перезаписати репозиторій в 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)
  8. Чтобы удалить конфиденциальный файл из выпусков с тегами, потребуется также выполнить принудительную отправку в теги 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.

  1. Зверніться до служби підтримки GitHub, щоб видалити кешовані перегляди та посилання на конфіденційні дані в pull requests на GitHub . Вкажіть ім'я репозиторію та/або посилання на коміт, необхідне для видалення.

  2. Повідомте співавторів про переміщення змін з однієї гілки в іншу і не об'єднуйте гілки, створені зі старого (пошкодженого) журналу сховища. Один коміт злиття може повернути деякі або всі пошкоджені журнали, які щойно потрібно було очистити.

  3. Через деякий час, коли ви переконаєтеся, що в інструменті 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

Подальше читання

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297