• Czas czytania ~7 min
  • 10.04.2023

Po zatwierdzeniu poufnych danych, takich jak hasło lub klucz SSH, w repozytorium Git można je usunąć z dziennika. Aby całkowicie usunąć niepotrzebne pliki z dziennika repozytorium, możesz użyć narzędzia lub narzędzia git filter-repo open source BFG Repo-Cleaner.

Narzędzie git filter-repo i BFG Repo-Cleaner nadpisują dziennik repozytorium, co zmienia agentów kondycji SYSTEM dla istniejących zatwierdzeń, które modyfikujesz, i wszystkich zależnych zatwierdzeń. Zmodyfikowani agenci kondycji zatwierdzenia mogą wpływać na otwarte żądania ściągnięcia w repozytorium. Przed usunięciem plików z repozytorium zaleca się scalenie lub zamknięcie wszystkich otwartych żądań ściągnięcia.

Możesz usunąć plik z ostatniego zatwierdzenia przy użyciu pliku Ostatnie zatwierdzenie Aby uzyskać informacje na temat usuwania pliku dodanego z ostatnim zatwierdzeniem, zobacz Informacje o dużych plikach w witrynie GitHub.You can remove a file from the last commit by using git rmthe Last Commit file for information about removing a file added with the last commit, see About large files on GitHub.

Ostrzeżenie. W tym artykule opisano, jak uniemożliwić dostęp do poufnych danych z gałęzi lub tagów w repozytorium w GitHub.com. Jednak te zatwierdzenia nadal mogą być dostępne w dowolnych klonach lub rozwidleniach repozytorium bezpośrednio za pośrednictwem skrótów SHA-1 w widokach buforowanych w GitHub, a także za pośrednictwem wszelkich żądań ściągnięcia odwołujących się do nich. Nie można usunąć poufnych danych z klonów repozytorium innych użytkowników, ale można trwale usunąć buforowane widoki i linki do poufnych danych w żądaniach ściągnięcia w usłudze GitHub, kontaktując się z pomocą techniczną usługi GitHub.You can't remove sensitive data from clones of other users' repository, but you can permanently remove cached views and links to sensitive data in pull requests on GitHub by contact GitHub support.

Jeśli zatwierdzenie, które wprowadziło poufne dane, istnieje w jakimkolwiek rozwidleniu repozytorium, będzie ono nadal dostępne, chyba że właściciel rozwidlenia usunie poufne dane z rozwidlenia lub całkowicie usunie rozwidlenie.

Po wysłaniu zatwierdzenia do usługi GitHub wszelkie poufne dane w zatwierdzeniu powinny być traktowane jako naruszone. Jeśli hasło zostało naprawione, musisz je zmienić. Jeśli klucz został naprawiony, utwórz nowy. Usunięcie zainfekowanych danych nie eliminuje początkowej luki, szczególnie w istniejących klonach lub forkach repozytorium.

Należy wziąć pod uwagę te ograniczenia przy podejmowaniu decyzji o zastąpieniu dziennika repozytorium.

Czyszczenie pliku z dziennika repozytorium Plik można wyczyścić z dziennika repozytorium

za pomocą narzędzia lub narzędzia git filter-repo open source BFG Repo-Cleaner.

Korzystanie z BFG BFG

Repo-Cleaner to narzędzie stworzone i utrzymywane przez społeczność open source. Jest to szybsza i łatwiejsza alternatywa git filter-repo dla usuwania niechcianych danych.

Aby usunąć plik z poufnymi danymi i pozostawić ostatnie zatwierdzenie bez zmian, uruchom następujące polecenie:

$ bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

Чтобы заменить все вхождения текста, представленного в passwords.txt, в журнале репозитория, выполните:

$ bfg --replace-text passwords.txt

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

$ git push --force

Полные инструкции по использованию и загрузке см. в документации по BFG Repo-Cleaner.

Korzystanie z git filter-repo

Ważne! Jeśli wykonano je po ukryciu zmian, nie będzie można ich odzyskać za pomocą innych poleceń w celu ukrycia. Przed wykonaniem git filter-repogit filter-repozaleca się pokazanie wszystkich wprowadzonych zmian. Aby wyświetlić ostatni zestaw ukrytych zmian, uruchom polecenie git stash show -p | git apply -R . Aby uzyskać więcej informacji, zobacz Git Tools - Ukrywanie i czyszczenie.

Aby zademonstrować, jak to działagit filter-repo, pokażemy, jak usunąć poufny plik danych z dziennika repozytorium, dodać go do.gitignore i upewnić się, że nie został przypadkowo ponownie zatwierdzony.

  1. Zainstaluj najnowszą wersję narzędzia git filter-repo. Instalację można zainstalować ręcznie lub za pomocą Menedżera pakietów. Na przykład, aby zainstalować git-filter-repo narzędzie za pomocą HomeBrew, użyj polecenia brew install.

    brew install git-filter-repo
    

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

  2. Jeśli nie masz jeszcze lokalnej kopii repozytorium z poufnymi danymi w dzienniku, sklonuj repozytorium na komputerze lokalnym.

    $ 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 путем к файлу, который необходимо удалить, а не только именем файла. Эти аргументы:

    • Wymuś na Git przetworzenie, ale nie wyodrębnienie, całego dziennika każdej gałęzi i znacznika.
    • Usuń określony plik, a także wszelkie puste zatwierdzenia wygenerowane w wyniku.
    • Usuń niektóre konfiguracje, takie jak zdalny adres URL przechowywany w pliku . git/config. Może być konieczne wcześniejsze utworzenie kopii zapasowej tego pliku w celu późniejszego odzyskania.
    • Zastąp istniejące tagi
      $ 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.

    Nuta. Jeśli plik poufnych danych istniał w innych ścieżkach (w wyniku przeniesienia lub zmiany nazwy), należy również uruchomić to polecenie na tych ścieżkach.

  5. Dodaj poufny plik danych, aby .gitignorezapobiec przypadkowemu zatwierdzeniu.

    $ 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. Gdy stan repozytorium jest zadowalający, wprowadź lokalne zmiany, aby nadpisać repozytorium w GitHub.com, a także we wszystkich dodanych gałęziach. Usunięcie poufnych danych z dziennika zatwierdzania wymaga wypychania.

    $ 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

Po usunięciu poufnych danych za pomocą narzędzia BFG lub wysłaniu zmian do usługi GitHub musisz wykonać kilka czynności, aby całkowicie usunąć dane z usługi GitHub.After you delete sensitive data using the BFG tool or git filter-repo send changes to GitHub, there are a few things you need to do to completely remove the data from GitHub.

  1. Skontaktuj się z pomocą techniczną usługi GitHub, aby usunąć buforowane widoki i linki do poufnych danych w żądaniach ściągnięcia w usłudze GitHub.Contact GitHub support to remove cached views and links to sensitive data in pull requests on GitHub. Określ nazwę repozytorium i/lub odniesienie do zatwierdzenia wymagane do usunięcia.

  2. Poinformuj współpracowników, aby przenosili zmiany z jednej gałęzi do drugiej i nie scalali żadnych gałęzi utworzonych ze starego (uszkodzonego) dziennika repozytorium. Jedno zatwierdzenie scalania może zwrócić niektóre lub wszystkie uszkodzone dzienniki, które właśnie trzeba było wyczyścić.

  3. Po pewnym czasie, gdy masz pewność, że w narzędziu BFG/git filter-repo nie wystąpiły nieprzewidziane skutki uboczne, możesz wymusić usunięcie odwołania do wszystkich obiektów w lokalnym repozytorium i zebrać śmieci za pomocą następujących poleceń (w Git 1.8.5 lub nowszym):Zapobieganie przypadkowym zatwierdzeniom w przyszłości

    $ 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.

Istnieje kilka prostych sztuczek, aby uniknąć popełniania danych, których nie chcesz popełniać:

  • Użyj programu wizualnego, takiego jak GitHub Desktop lub gitk, aby zatwierdzić zmiany. Z reguły programy wizualne ułatwiają wyświetlanie plików, które będą dodawane, usuwane i zmieniane przy każdym zatwierdzeniu.
  • Unikaj używania poleceń typu catch-all git add . w wierszu poleceń i — używaj git add filename i git commit -a git rm filenameprzygotowuj każdy plik indywidualnie.
  • Służy git add --interactive do sprawdzania poprawności i przygotowywania każdej pojedynczej zmiany w każdym pliku.
  • Służy git diff --cached do weryfikowania zmian przygotowanych do zatwierdzenia. Jest to dokładna niezgodność, która wystąpi, git commit dopóki nie użyjesz pliku .-a

Linki zewnętrzne

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

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...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297