2014-12-02 14 views
5

Mam połączone 3 różne repo git w jednym teraz moja historia wygląda mniej więcej tak:Reorder git commit historię według daty

A1-A2-A3-B1-B2-B3-C1-C2-C3

Teraz chcę ponownie zamówić wszystkie te zatwierdzenia według daty. Więc w końcu może to być coś w rodzaju C1-A1-A2-B1-C2 -... masz pomysł

Jestem w porządku, jeśli utracę wszystkie oryginalne ID zatwierdzenia SHA. Oczywiście nie mogę zmienić kolejności ręcznie, więc potrzebuję skryptu lub pomysłów, jak do tego podejść.

Odpowiedz

0

Nie można zmienić A1-A2-A3-B1-B2-B3-C1-C2-C3 nie robiąc go ręcznie

4

To tylko pomysł, ja nie przetestować go dla tego scenariusza ale użyłem go (w inny sposób) do join two Git repositories and keep the original commit dates.

Jeśli historia ma rozgałęzienia i scalenia, myślę, że niemożliwe jest ich ponowne uporządkowanie i utrzymanie struktury, nawet ręcznej. Najlepsze, co można uzyskać, to historia liniowa.

Zapisz popełnić skrótów i znaczników czasu (%ct = datę %at = Data Autor commit) do pliku, sortować je według daty autor:

$ git log --pretty='%H %at %ct' --author-date-order --reverse > /tmp/hashlist 

Jeśli zamówienie dostarczane przez komendy powyżej nie spełnia następnie wymusić kolejność sortując wyjście używając jego drugie pole (data) autor:

$ git log --pretty='%H %at %ct' | sort -k 2 > /tmp/hashlist 

utworzyć nowe repozytorium do przechowywania historii uporządkowaną chronologicznie autora. Tworzenie początkowej commit ustawianie daty committer w przeszłości (przed najstarszym popełnić w repozytorium):

$ GIT_COMMITTER_DATE='2010-01-01 12:00:00' GIT_AUTHOR_DATE='2010-01-01 12:00:00' git commit --allow-empty 

Umieścić swój własny termin do komendy powyżej.

Dodaj stare repozytorium jako pilota do nowego, pobierz wszystkie jego zatwierdzenia. NIE NALEŻY ustawić gałęzi master nowego repo, aby śledzić jedno ze starych transakcji repo.

utworzyć skrypt, który będzie wiśnia wybrać warunkiem popełnienia i stosuje się go na szczycie aktualnej gałęzi, zachowując pierwotną datę autora i datę popełnienia:

$ echo '[email protected]$2 [email protected]$3 git cherry-pick $1' > /tmp/pick 
$ chmod +x /tmp/pick 

Jeśli nie chcesz zachować albo oryginalną datę autora lub datę użytkownika (lub obie), a następnie po prostu usuń odpowiednie przypisanie z powyższego wiersza poleceń.

Użyj nowego skryptu z xargs, aby wybrać każde zatwierdzenie w wybranej kolejności i zatwierdzić je na górze nowej gałęzi głównej.

$ cat /tmp/hashlist | xargs -n 3 /tmp/pick 

Jeśli wszystko poszło dobrze, usuń pliki tymczasowe utworzone podczas procesu.

$ rm /tmp/hashlist 
$ rm /tmp/pick 

Uwagi:

  • Dostaniesz historię liniowej. Oryginalne gałęzie i połączenia nie zostaną ponownie utworzone na osi czasu nowej historii.
  • Niezamknięte gałęzie nie będą w ogóle kopiowane. Możesz użyć git rebase, aby skopiować i dołączyć je do nowych zatwierdzeń.
  • Nawet jeśli twoje repozytorium nie ma oddziałów, nadal istnieje duże prawdopodobieństwo konfliktu w sprawie wyrażeń typu wiśnia; zależy to od wielu zmian wprowadzonych przez zatwierdzenia w nowej kolejności.
  • Jeśli to nie zadziała, zawsze możesz usunąć nowe repozytorium i zacząć od nowa (lub zakończyć próbę); stare repozytorium nie zostało zmienione.
+0

Twój pomysł wydaje się logiczny. Wiśniowe kostki działają teraz. Nadzieję na brak/niewielkie konflikty – Blitzkr1eg

+0

Miałem wiele konfliktów, więc porzuciłem to podejście. Pozwoliłem im więc na A1-A2-A3-B1-B2-B3-C1-C2-C3, jakby byli po scaleniu. – Blitzkr1eg

+0

Gdy tworzy różnicę, 'git' zapisuje nie tylko zmienione linie, ale także kontekst zmiany (1 linia przed i 1 linia po zmianie). Używa tych linii, gdy stosuje diff, aby upewnić się, że diff może być bezpiecznie zastosowany. Jeśli linie kontekstowe nie pasują (np. Ponieważ zostały dodane/zmienione przez zatwierdzenie, które było wcześniej w oryginalnej linii czasu, ale chcesz zastosować później w zmodyfikowanej linii czasu), pojawia się konflikt. Niestety automatyczne rozwiązywanie konfliktów nie jest bezpieczne. Jeśli masz wiele konfliktów, być może zmiana kolejności popełnienia nie jest możliwa. – axiac