2013-01-15 20 views
15

Mam dość duże repozytorium Git z tysiącami commitów, pierwotnie importowanych z SVN. Zanim udostępnię moje repozytorium, chciałbym posprzątać kilkaset komunikatów commit, które nie mają sensu w moim nowym repozytorium, a także usunąć cały tekst informacyjny git-svn, który został dodany.Jaki jest najszybszy sposób na edycję setek wiadomości zatwierdzania Git?

Wiem, że mogę użyć "git rebase -i", a następnie "git commit --amend", aby edytować każdą wiadomość o zatwierdzeniu, ale z setkami wiadomości do edycji, to jest ogromny problem z tym, co wiesz -co.

Czy istnieje szybszy sposób edycji wszystkich tych wiadomości zatwierdzania? Najlepiej byłoby, gdyby każda wiadomość zatwierdzenia znajdowała się w jednym pliku, a ja mógłbym je wszystkie edytować w jednym miejscu.

Dzięki!

Odpowiedz

11

Łatwo to zrobić w następujący sposób:

  • Wykonaj najpierw zaimportować.
  • Export wszystkim zobowiązuje się tekstem:

    git format-patch -10000 
    

    Numer powinien być dłuższy niż łącznie zobowiązuje. Spowoduje to utworzenie wielu plików o nazwie NNNNN-commit-description.patch.

  • Edytuj te pliki, używając jakiegoś skryptu. (Nie dotykaj niczego w nich oprócz górnego z komunikatami zatwierdzenia).
  • Skopiuj lub przenieś edytowane pliki do pustego repozytorium git lub oddziału.
  • Importuj wszystko edytowany zobowiązuje powrotem:

    git am *.patch 
    

To zadziała tylko jeden oddział, ale działa bardzo dobrze.

+0

Wygląda obiecująco, dziękuję! Niestety otrzymuję błąd "Bad file number" podczas uruchamiania "git am * .patch". Jestem w systemie Windows 7, a szybkie wyszukiwanie Google sugeruje, że jest to związane z przekroczeniem maksymalnej liczby argumentów wiersza poleceń, co ma sens, biorąc pod uwagę, że istnieje plik łaty dla każdego zatwierdzenia. Spróbuję tego na moim Macu trochę później. –

+0

Możesz to zrobić w małych partiach, po prostu upewnij się, że kolejność wzrasta – mvp

+0

'ls * .patch | xargs git am' automatyzuje to. – jthill

0

Jako alternatywę rozważ pominięcie importu całego repozytorium. Chciałbym po prostu wymeldować się, posprzątać i oddać ważne punkty w historii.

9

To stare pytanie, ale ponieważ nie ma żadnej wzmianki o git filter-branch, po prostu dodaję dwa centy.

Niedawno musiałem masowo zastąpić tekst w komunikacie zatwierdzenia, zastępując blok tekstu innym bez zmiany pozostałych komunikatów zatwierdzenia. Na przykład, musiałem wymienić Refs: #xxxxx z Refs: # 22917.

użyłem git filter-branch jak ten

git filter-branch --msg-filter 'sed "s/Refs: #xxxxx/Refs: #22917/g"' master..my_branch 
  • użyłem opcji --msg-filter tylko edytować commit wiadomość, ale można stosować inne filtry, aby zmienić pliki, edytować pełny popełnić infos itp
  • I ograniczone filter-branch przez zastosowanie go tylko do zatwierdzeń, które nie były w systemie głównym (master..my_branch), ale można je zastosować w całym oddziale, pomijając zakres zatwierdzeń.

Zgodnie z sugestią w dokumencie, spróbuj tego na kopii swojego oddziału. Nadzieję, że pomaga.


Źródła wykorzystane na odpowiedź

+1

--msg-filter wypisuje komunikat zatwierdzenia na STDOUT i pobiera nowy komunikat zatwierdzenia na STDIN, więc musisz użyć "sed" zamiast "sed -i":

git filter-branch --msg-filter 'sed "s/Refs: #xxxxx/Refs: #22917/g"' master..my_branch

+1

@SimonDesfarges Masz absolutną rację! To nie działa, aktualizuję odpowiedź od razu. –

1

Można użyć git rebase -i i zamień pick na (lub po prostu r). Następnie git rebasing zatrzymuje się przy każdym zatwierdzeniu dając szansę na edycję wiadomości.

Jedyne wady to to, że nie widzisz wszystkich wiadomości naraz i że nie możesz wrócić, gdy zauważysz błąd.

+0

To nie jest droga. Otwieranie 1000 komunikatów zatwierdzania po jednym na raz zajmuje około 8,5 godziny, aby wykonać je wszystkie. obliczenie około 30 sekund wiadomości – Whitecat

+0

@Whitecat źle zrozumiałem pytanie, więc chcesz wykonać ręczne czyszczenie, ale chcesz coś zautomatyzowanego. Więc jaki jest problem z 'git filter-branch' wymienionym w [innej odpowiedzi] (http://stackoverflow.com/a/37941403/581205)? – maaartinus

+0

Mam problem z 'git filter-patch', który pokazuje tylko poprawki, a nie zatwierdzenia. Mam ponad 6000 wiadomości do zatwierdzenia, które chcę zmienić. Ale kiedy robię 'git filter-patch -100000 HEAD', otrzymuję tylko 500 plików łatek. – Whitecat

2

Świetnym i prostym sposobem na to byłoby użycie git filter-branch --msg-filter "" ze skryptem python.

Skrypt Pythona będzie wyglądać mniej więcej tak:

import os 
import sys 
import re 

pattern = re.compile("(?i)Issue-\d{1,4}") 


commit_id = os.environ["GIT_COMMIT"] 
message = sys.stdin.read() 

if len(message) > 0: 

    if pattern.search(message): 
     message = pattern_conn1.sub("Issue",message) 

print message 

Linia poleceń wywołać byś zrobić to git filter-branch -f --msg-filter "python /path/to/git-script.py"

Powiązane problemy