2011-08-25 12 views
29

Kiedy zacząłem moje repozytorium git, wykonałem kilka plików jako wstępne zatwierdzenie. Teraz, po wielu zobowiązaniach, zauważyłem, że zawarłem w tych plikach wiersz z informacjami, których nie chcę publikować (w przeciwieństwie do reszty kodu). Więc chcę usunąć/zmienić tę jedną linię i zachować resztę kodu.git: zmiana jednej linii w pliku dla pełnej historii

Wyszukiwanie Znalazłem to rozwiązanie: Wstaw pusty commit jako wstępne zatwierdzenie (opisane tutaj: Insert a commit before the root commit in Git?), zrób z niego bazę, a następnie edytuj stare pierwsze zatwierdzenie przez zmianę. Niestety podczas reorganizacji pojawia się wiele okrutnych konfliktów scalonych (jak opisano tutaj: git: solving conflicts caused by rebase).

Czy istnieje inny sposób rozwiązania mojego problemu lub konieczności ręcznego zmieniania i edycji wszystkich konfliktów?

góry dzięki :)

Tibo

+0

Jeśli tylko zmiana jednego wiersza, konflikty scalania powinny być bardzo małe. – Clueless

+0

możliwy duplikat [Jak usunąć poufne pliki z historii git] (http://stackoverflow.com/questions/872565/how-do-i-remove-sensitive-files-from-gits-history) –

+0

@ Clueless: Konflikty powstają podczas przekierowania, są to konflikty, które rozwiązałem w przeszłości. – tbolender

Odpowiedz

38

Oto polecenia, które usunie linia naruszająca prawa z historii pliku we wszystkich oddziałach:

git filter-branch --tree-filter 'sed -i "/sensitive information/ d" filename' -- --all 

Sprawdza każdą wersję, uruchamia polecenie sed, a następnie zatwierdza tę wersję.

Komenda sed dopasowuje w tym przypadku wszystkie wiersze zawierające wzór sensitive information w pliku o nazwie filename i usuwa te linie.

Uwaga: to dobrze, jeśli masz kopię zapasową i najpierw wypróbuj skrypt sed, aby upewnić się, że robi to, co chcesz, ponieważ uruchomienie długiej historii może potrwać dłuższą chwilę.

+0

Czy istnieje możliwość zignorowania błędu sed (np. Gdy plik nie istnieje w jednej wersji)? – tbolender

+3

Nie wiem, czy opcja '-q' to robi czy nie. Być może trzeba będzie zawinąć go w powłokę jeśli-wtedy, jak 'if [-e plik]; następnie sed ...; fi –

+0

Używanie powłoki, jeśli dla mnie pracował :) – tbolender

4

Zrobiłem to polecenie, że nie o błędzie, gdy plik nie istnieje:

filename=./path/to/your/filename 
filter=your_regex_here 

git filter-branch --tree-filter 'test -f $filename && sed -i.bak "/$filter/d" $filename || echo “skipping file“' -- --all 
Powiązane problemy