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 rm
the 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-repo
git filter-repo
zaleca 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.
-
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 poleceniabrew install
.brew install git-filter-repo
Дополнительные сведения см. в файле INSTALL.md в репозитории
newren/git-filter-repo
. -
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.
-
Перейдите в рабочую папку репозитория.
$ cd YOUR-REPOSITORY
-
Выполните следующую команду, заменив
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.
-
Dodaj poufny plik danych, aby
.gitignore
zapobiec 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(-)
-
Внимательно проверьте, удалили ли вы все, что требуется, из журнала репозитория и все ли ветви извлечены.
-
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)
-
Чтобы удалить конфиденциальный файл из выпусков с тегами, потребуется также выполнить принудительную отправку в теги 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.
-
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.
-
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ć.
-
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żywajgit add filename
igit commit -a
git rm filename
przygotowuj 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