Mazání hesel a souborů z historie gitových repozitářů


Někdy se stane, že se do gitového repozitáře dostane nějaké to heslo, nebo soubor, který tam být nemá. Zde je návod, jak se s tím vypořádat.

  • Stáhneme si Githubem doporučený BFG Repo-Cleaner
  • Smažeme z repozitáře soubory, které chceme smazat z historie. To samé s hesly. Důležité je, aby to co chceme smazat nebylo v HEAD commitu, který se nepromazává, což je z bezpečnostních důvodů.
  • Pusheneme všechny commity na server
  • Někde bokem si uděláme mirror repozitáře. Jedná se o bare klon, doplněný o všechny reference, větve aj. Tedy je to kopie 1:1, bez inicializace gitu. Mirror není určený na přímou editaci obsahu repozitáře.
git clone --mirror url_repozitare
  • Dále si vlezeme do vytvořeného repozitáře.

Mazání hesel

Pokud chceme smazat hesla, uložíme si je třeba do passwords.txt a zavoláme příkaz (cesty jsou tak jak je mám já na svém ntb) viz. níže. Program BFG projde soubor s hesly a pokud je v repozitáři někde najde, nahradí je textem ***REMOVED***. Také dojde k přepočítání SHAček, každého zasaženého commitu.

java.exe -jar C:\Programy\bfg\bfg.jar --replace-text passwords.txt
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push

Tip: Pokud git push hlásí chybu, je to nejspíše proto, že máte větev, která se aktualizuje označenou jako protected, což automaticky platí o hlavní větvi. Je potřeba větev nejdříve odblokovat, respektive jí povolit force push.

Mazání souborů

Pokud chceme smazat soubory, které v repozitáři nechceme, uděláme to pomocí příkazu, v kterém uvedeme soubor, který se má smazat. V tomto případě mažeme soubor paths.txt, který obsahuje citlivé údaje.

java.exe -jar C:\Programy\bfg\bfg.jar --delete-files paths.txt
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push

Na závěr, je potřeba uvést, že uvedené sice funguje, ale může to způsobit nějaké problémy.
Zdroj informací: Removing sensitive data from a repository – GitHub Docs