Czy miałoby sens wykonanie operacji z git rebase
zachowaniem sygnatur czasowych zatwierdzenia?
Uważam, że konsekwencją byłoby to, że nowa gałąź niekoniecznie będzie miała chronologicznie daty zatwierdzeń. Czy to w ogóle teoretycznie możliwe? (np. użycie poleceń hydraulicznych; tutaj tylko ciekawy)
Jeśli jest to teoretycznie możliwe, to czy w praktyce można przy rebase nie zmieniać znaczników czasu?
Na przykład załóżmy, że mam następujące drzewo:
master <jun 2010>
|
:
:
: oldbranch <feb 1984>
: /
oldcommit <jan 1984>
Teraz, gdybym rebase oldbranch
na master
, data zatwierdzenia zmian od lutego 1984 do Jun 2010. Czy jest możliwe, aby zmienić to zachowanie, tak aby popełnić timestamp nie zmieniło? Ostatecznie uzyskałbym w ten sposób:
oldbranch <feb 1984>
/
master <jun 2010>
|
:
Czy to w ogóle miałoby sens? Czy jest w ogóle dozwolone w git mieć historię, w której stary commit ma nowszy commit jako rodzic?
źródło
git rebase --committer-date-is-author-date SHA
. Zobacz moją zredagowaną odpowiedź poniżejOdpowiedzi:
Aktualizacja z czerwca 2014 r .: David Fraser wspomina w komentarzach o rozwiązaniu opisanym również w sekcji „ Zmień sygnatury czasowe podczas ponownego bazowania gałęzi git ”, używając opcji
--committer-date-is-author-date
(wprowadzonej początkowo w styczniu 2009 r. W zatwierdzeniu 3f01ad6Zobacz
git am
:(Oryginalna odpowiedź, czerwiec 2012)
Możesz spróbować, aby uzyskać nieinteraktywną rebase
(z tej odpowiedzi SO )
To jest przekazywane do
git am
, który wspomina:W przypadku
git rebase
tej opcji jest to „Niezgodna z opcją --interactive”.Ponieważ możesz dowolnie zmieniać znacznik czasu starej daty zatwierdzenia (za pomocą
git filter-branch
), przypuszczam, że możesz uporządkować historię Git z dowolną kolejnością dat zmian , jakiej chcesz / potrzebujesz, a nawet ustawić ją na przyszłość! .Jak wspomina Olivier w swoim pytaniu, data autora nigdy nie jest zmieniana przez ponowne bazy danych;
Z książki Pro Git :
Aby było jasne, w tym przypadku, jak komentuje Olivier:
źródło
git rebase --ignore-date
nie działa. Zmienia daty ponownych zatwierdzeń.--ignore-date
działa odwrotnie niż ja próbowałem osiągnąć! Mianowicie usuwa sygnaturę czasową autora i zastępuje je znacznikami czasu zatwierdzeń! Tak więc prawidłowa odpowiedź na moje pytanie brzmi: nie rób nic, ponieważgit rebase
tak naprawdę nie zmienia domyślnie sygnatur czasowych autorów.--committer-date-is-author-date
opcja wydaje się pozostawić sygnaturę czasową autora i ustawić sygnaturę czasową autora, aby była taka sama, jak oryginalna sygnatura czasowa autora, czego chciał Olivier ...Jeśli już schrzaniłeś daty zatwierdzenia (być może z rebase) i chcesz zresetować je do odpowiednich dat autorów, możesz uruchomić:
git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE'
źródło
WARNING: Ref 'refs/heads/master' is unchanged
. Używam git w wersji 1.7.9.5 w systemie Linux (64-bitowy)git rebase --committer-date-is-author-date <base_branch>
ten sposób git zresetuje datę zatwierdzenia tylko dla zatwierdzeń zastosowanych w <base_branch> (co jest prawdopodobnie ta sama nazwa gałęzi, której użyłeś, kiedy schrzaniłeś).Kluczową kwestią Von C pomógł mi zrozumieć, co się dzieje: gdy rebase tego, committer za zmiany datownika, ale nie autora datownik, który nagle wszystko ma sens. Więc moje pytanie nie było wystarczająco precyzyjne.
Odpowiedź jest taka, że rebase w rzeczywistości nie zmienia sygnatur czasowych autora (nie musisz w tym celu nic robić), co mi odpowiada.
źródło
Domyślnie git rebase ustawi sygnaturę czasową osoby zatwierdzającej na czas utworzenia nowego zatwierdzenia, ale pozostawi nienaruszoną sygnaturę czasową autora. W większości przypadków jest to pożądane zachowanie, ale w niektórych scenariuszach nie chcemy również zmieniać sygnatury czasowej komendanta. Jak możemy to osiągnąć? Cóż, oto sztuczka, którą zwykle robię.
Po pierwsze, upewnij się, że każde z zatwierdzeń, które zamierzasz przebudować, ma unikalny komunikat o zatwierdzeniu i znacznik czasu autora (w tym miejscu sztuczka wymaga ulepszeń, ale obecnie odpowiada moim potrzebom).
Przed rebase zapisz sygnaturę czasową autora, znacznik czasu autora i informację o zatwierdzeniu wszystkich zatwierdzeń, które zostaną przeniesione do pliku.
Następnie pozwól, aby rebase nastąpił.
Na koniec zamieniamy sygnaturę czasową bieżącego autora na ten zapisany w pliku, jeśli komunikat zatwierdzenia jest taki sam przez using
git filter-branch
.Jeśli coś pójdzie nie tak, po prostu przejdź do kasy
git reflog
lub wszystkierefs/original/
referencje.Furthormore, możesz zrobić to samo ze znacznikiem czasu autora.
Na przykład, jeśli sygnatura czasowa autora niektórych zatwierdzeń jest poza kolejnością i bez zmiany kolejności tych zatwierdzeń, po prostu chcemy, aby sygnatura czasowa autora była wyświetlana w kolejności, pomocne będą następujące polecenia.
źródło