2012-12-23 15 views
11

Popełniłem błąd, a jeden plik na projekcie w repozytorium git zawiera hasło. Nie stanowi to problemu, ponieważ nie jest publicznym repo, ale chciałbym się go pozbyć w repozytorium.edytuj plik we wszystkich zatwierdzeniach w git

Historia repozytorium jest bardzo prosta, ponieważ jestem jedynym programistą, więc ma tylko 12 zatwierdzeń i jedno z zatwierdzeń jest oznaczone.

Zmiana w tym przypadku nie wpłynie na nic w historii (różnica pozostanie taka sama), ponieważ hasło, które chcę usunąć, jest obecne od pierwszego zatwierdzenia. Chciałbym usunąć ten ciąg, jakby go tam nie było w żadnym momencie.

Czy jest jakieś polecenie, aby to zrobić, czy muszę zregenerować historię od samego początku z nowym punktem początkowym bez hasła i stosowaniem różnic na górze?

+1

ja oflagowany to jako duplikat http://stackoverflow.com/questions/1186535/how-to- modify-a-specified-commit, gdzie masz odpowiedź. – zmo

+0

@zmo: link, który podałeś, nie ma nic wspólnego z tym pytaniem.może to być duplikat czegoś, ale nie tego. – mvp

Odpowiedz

6

Zobacz https://help.github.com/articles/remove-sensitive-data. plik będzie obecny we wszystkich zatwierdzeniach, jeśli go nie usunąłeś, ponieważ wszystkie zatwierdzenia zawierają stan całego repozytorium.

Zasadniczo, należy uruchomić gałąź filtrów we wszystkich zatwierdzeniach, a następnie zmusić ją do przeniesienia. Polecenie jest destrukcyjne i zmieni wszystkie zatwierdzenia, w których plik był obecny podczas repozytorium, więc bądź ostrożny.

+1

Aby rozwinąć na tym: szukasz 'git filter-branch --tree-filter'. Przekaż skrypt do tego, który zmienia żądaną zmianę, a git sprawdzi każde zatwierdzenie, uruchom skrypt i ponownie utworzy zatwierdzenie wraz ze zmianami. – Chronial

2

Dzięki temu dokładnie to polecenie, którego szukałem i przeczytałem ten artykuł oraz dokumentację z gałęzi filtra, uzyskałem dokładnie taką składnię, jaką chciałem użyć sed do usunięcia napisu z pliku.

git filter-branch --tree-filter "sed -i 's/\<password\>//g' ./path_to_file/filename" --prune-empty --tag-name-filter cat -- --all 

gdzie:

"hasło" -> Czy ciąg znaków, który musi być usunięty

"./path_to_file/filename" -> jest ścieżką do pliku wewnątrz repo, który potrzebuje do modyfikacji

uruchomione w repozytorium zrobiło sztuczkę jak urok.

Po wprowadzeniu zmiany należy ją przekazać do zdalnego serwera. To trzeba wymusić, aby serwer zaakceptował całkowicie nowe przepisane słowa i znaczniki.

Więc zmuszony naciśnięcie repo do serwera zdalnego (pochodzenie w większości przypadków)

git push origin --all --force 

I zmuszony Push znaczników do zdalnego serwera

git push origin --tags --force 
+1

Pamiętaj, że musisz również a) zmusić go do repozytorium i b) wyczyścić wszystkie lokalne klony repo. Właśnie dlatego połączyłem się z dłuższym artykułem i nie starałem się uwzględnić wszystkich tutaj. – eis

+0

Tak, po poleceniu zrobiłem wymuszone naciśnięcie zarówno refs, jak i tagów. Zamierzam edytować tę odpowiedź pod kątem kompletności. Dzięki. –

0

zrobiłbym następujące :

git rebase --interactive 

Zmień polecenie pick przed pierwszym commit (commit z hasłem) do edit i zachowaj wszystkie pozostałe linie bez zmian. Zapisz plik i zakończ.

Następnie usunąć hasło z pliku (i zrobić jakieś inne wymagane zmiany), a następnie:

git add name-of-file-with-password 
git commit --amend 
git rebase --continue 
Powiązane problemy