Potrzebowałem zrobić podobny przepis na niepotrzebnie duże repozytorium, podczas gdy repo była w trybie offline. Podejście, które podjąłem, było próbą zautomatyzowanego "interaktywnego" rebase przy użyciu GIT_SEQUENCE_EDITOR
, który jest objęty w this answer przez @ james-foucar & @ pfalcon.
Aby to działało dobrze, lepiej było najpierw usunąć scalenia z sekcji przepisywanej historii. Dla mojego własnego przypadku zostało to zrobione przy użyciu dużej liczby git rebase --onto
, która jest obszernie omówiona w innych kwestiach dotyczących StackOverflow.
stworzyłem small script generate-similiar-commit-squashes.sh
do generowania pick
& squash
polecenia tak, że kolejne podobne commity będzie ściśnięty. Użyłem author-date-and-shortlog, aby dopasować podobne zatwierdzenia, ale potrzebujesz tylko autora (mój komentarz ma komentarz o tym, jak dopasować go tylko do autora).
$ generate-similiar-commit-squashes.sh > /tmp/git-rebase-todo-list
Wyjście wygląda
...
pick aaff1c556004539a54a7a33ce2fb859af0c4238c [email protected]
squash aa190ea2323ece42f1cd212041bf61b94d751d5c [email protected]
pick aab8c98981a8d824d2bc0d5278d59bc1a22cc7b0 [email protected]_config.yml
Repozytorium było również pełne self-powraca z tym samym stylu „xyz” Aktualizacja popełnienia wiadomości. Gdy zostały zgniecione, skutkowały pustymi zobowiązaniami.
Przeprowadzane przeze mnie zatwierdzenia miały identyczne komunikaty zatwierdzenia. git rebase -i
oferuje poprawiony komunikat zatwierdzenia z dołączonymi wszystkimi komunikatami zatwierdzenia typu zgniecenia, które byłyby powtarzalne. Aby rozwiązać ten problem, użyłem małego skryptu perl z this answer, aby usunąć zduplikowane linie z komunikatu zatwierdzenia oferowanego przez git rebase
. Jest lepiej w pliku, ponieważ będzie używany w zmiennej powłoki.
$ echo 'print if ! $x{$_}++' > /tmp/strip-seen-lines.pl
teraz na końcowym etapie:
$ GIT_EDITOR='perl -i -n -f /tmp/strip-seen-lines.pl ' \
GIT_SEQUENCE_EDITOR='cat /tmp/git-rebase-todo-list >' \
git rebase --keep-empty -i $(git rev-list --max-parents=0 HEAD)
Pomimo zastosowania --keep-empty
, git
skarżył się kilka razy w tym procesie o pustych zobowiązuje. Zrzuciłbym mnie na konsolę z niekompletnym git rebase
. Aby pominąć puste zatwierdzanie i wznowić przetwarzanie, potrzebne były następujące dwa polecenia (raczej często w moim przypadku).
$ git reset HEAD^
$ GIT_EDITOR='perl -i -n -f /tmp/strip-seen-lines.pl ' git rebase --continue
Ponownie mimo --keep-empty
, znalazłem had no empty commits w końcowym historii git, więc resetuje powyżej usunął je wszystkie. Zakładam, że coś jest nie tak z moim gitem, wersja 2.14.1. Przetwarzanie ~ 10000 takich zatwierdzeń zajęło nieco ponad 10 minut na brzydkim laptopie.
Brzmi to tak, jakby mogło to prowadzić do niepotrzebnego wysiłku. Oznacza to, że jeśli zobowiązania danego autora nie są kolejne, to ich zgniecenie będzie wymagać dużej ręcznej interwencji. Lepiej byłoby, gdyby wielu autorów pracowało we własnym oddziale. – larsks