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