Zmień sygnatury czasowe podczas zmiany bazy git branch

99

Zreorganizowałem zatwierdzenia w gałęzi, zanim zostanie ona upubliczniona, powodując pomieszanie znaczników czasu zatwierdzeń. Wolałbym, żeby wszystkie były dzisiaj, a pomiędzy nimi są tylko sekundy.

Oczywiście te znaczniki czasu również nie będą poprawne, ale ponieważ jest to czas, w którym sprawy trafiają do publicznej wiadomości, wolę to od skomplikowanej historii, jeśli chodzi o czas.

Jak więc powiedzieć gitowi, aby tworzył nowe znaczniki czasu podczas zmiany bazy?

stęp
źródło
Z Git 2.29 (Q4 2020), a git rebase --rootlub -i, with --reset-author-datebędzie działać. Zobacz moją odpowiedź poniżej
VonC

Odpowiedzi:

135
git rebase --ignore-date
Michael Krelin - haker
źródło
2
Wypróbowałem to przed wysłaniem .. Z wyjątkiem tego, że nie zrobiłem tego interaktywnie, może to jest sztuczka? Czy wypróbowałeś również alias --committer-date-is-author-date? Może --ignore-date została wprowadzona w późniejszej wersji, nie mam pojęcia.
Michael Krelin - haker
2
Tak, jeśli zostanie wykonane nieinteraktywnie, działa. Ale wtedy - jak zawsze w przypadku rebase - nie ma to wpływu na pierwsze zatwierdzenie.
tarsius
2
@ MichaelKrelin-hacker: zgodnie z dokumentacją, --ignore-date Te flagi są przekazywane do git am w celu łatwej zmiany dat rewizji zatwierdzeń (zobacz git-am [1]). Niezgodne z opcją --interactive.
Tim
4
@Tim Zatwierdzenie roota nie ma rodzica, a kiedy zadałem to pytanie, chciałem również zmienić datę tego zatwierdzenia. Teraz mamy --root, co to umożliwia.
tarsius
3
Incompatible with the --interactive option. Zobacz dokumentację
Vlastimil Ovčáčík,
28

W moim przypadku zmiana bazy zmieniła znaczniki czasu na wartość CommitDate, więc w gitweb kilka miesięcznych zatwierdzeń pojawiło się jako sprzed 4 dni. Znalazłem ostatnie zatwierdzenie z poprawną datą i:

$ git rebase --committer-date-is-author-date SHA
lkraav
źródło
39
Nie, nie jest. W rzeczywistości jest dokładnie odwrotnie. Z dokumentów git rebase: „ Te flagi są przekazywane do, git amaby łatwo zmienić daty zmian na podstawie zatwierdzeń ”. W git amnim jest napisane: --committer-date-is-author-date[…] pozwala użytkownikowi kłamać na temat daty autora, używając tej samej wartości, co data autora ”, podczas gdy --ignore-date[…] pozwala użytkownikowi kłamać na temat daty autora, używając tej samej wartości jako data zatwierdzającego ”.
Enrico Campidoglio
13

Istnieją następujące sposoby

  1. Normalna rebase

    git rebase --ignore-date
    
  2. Interaktywna rebase

    git rebase -i master
    git commit --amend --date=now
    git push origin <branch> -f
    
Umar Asghar
źródło
1

Z komentarzy:

Niezgodny z --interactive option

Właściwie ... nie jest już niekompatybilny z Git 2.29 (Q4 2020): „ git rebase -i( man ) uczy się nieco więcej opcji .
Opcje zgodne z:

  • --interactive/-i
  • --root!

Zobacz commit 6160b2e (26 sierpnia 2020) autorstwa Junio ​​C Hamano ( gitster) .
Zobacz commit 2712669 (17 sierpnia 2020) i commit ef484ad (13 Jul 2020) autorstwa Rohita Ashiwala ( r1walz) .
Zobacz commit a3894aa , commit 7573cec , commit e8cbe21 (17 sierpnia 2020) autorstwa Phillip Wood ( phillipwood) .
(Scalone przez Junio ​​C Hamano - gitster- w zobowiązaniu 9c31b19 , 03 września 2020 r.)

rebase -i: wsparcie --ignore-date

Oryginalna naszywka-przez: Rohit Ashiwal
Podpisana-przez: Phillip Wood

Rebase jest implementowany z dwoma różnymi backendami - „ apply” i „ merge”, z których każdy obsługuje inny zestaw opcji.

W szczególności backend Apply obsługuje szereg opcji zaimplementowanych przez ' ( man ) ', które nie są zaimplementowane w backendie scalającym. Oznacza to, że dostępne opcje są różne w zależności od używanego zaplecza, co jest mylące.git am

Ta poprawka dodaje obsługę --ignore-dateopcji do zaplecza scalania.

Ta opcja używa aktualnego czasu jako daty autora, zamiast ponownie używać oryginalnej daty autora podczas przepisywania zatwierdzeń.
Dbamy o to, aby obsłużyć połączenie --ignore-datei --committer-date-is-author-datew taki sam sposób, jak backend aplikacji.

I:

rebase: Dodaj --reset-author-date

Pomoc: Junio ​​C Hamano
Podpisał: Rohit Ashiwal

W poprzednim zatwierdzeniu wprowadzono --ignore-dateflagę do rebase -i, ale nazwa jest raczej niejasna, ponieważ nie mówi, czy data autora lub autorki jest ignorowana.
Dodaj alias, aby określić dokładny cel.

--reset-author-date

Również:

rebase -i: support --committer-date-is-author-date

Oryginalna naszywka-przez: Rohit Ashiwal
Podpisana-przez: Phillip Wood

Ta poprawka dodaje obsługę --committer-date-is-author-dateopcji do zaplecza scalania.
Ta opcja używa daty autora przepisywanego zatwierdzenia jako daty osoby zatwierdzającej, kiedy tworzone jest nowe zatwierdzenie.

git rebaseteraz zawiera na swojej stronie podręcznika :

--committer-date-is-author-date:

Zamiast używać aktualnego czasu jako daty zatwierdzającego, użyj daty autora zmiany podstawy zatwierdzenia jako daty zatwierdzającego.
Ta opcja implikuje --force-rebase.

git rebasezawiera również na swojej stronie podręcznika :

--ignore-date:

Ta flaga jest przekazywana do 'git am', aby zmienić datę autora każdego zatwierdzenia zmiany bazy (zobacz git am).


Zauważ, że w 2.29 (powyżej), " --committer-date-is-author-date" opcja " rebase" i " am" komend przez pomyłkę straciła adres e-mail, co zostało poprawione w Git 2.29.1 (Q4 2020).

Zobacz commit 5f35edd , commit 16b0bb9 , commit 56706db (23 października 2020) autor: Jeff King ( peff) .
(Scalone przez Junio ​​C Hamano - gitster- w zatwierdzeniu f34687d , 26 października 2020 r.)

am: napraw uszkodzony e-mail z --committer-date-is-author-date

Podpisał: Jeff King

Commit e8cbe2118a ( am: przestań eksportować GIT_COMMITTER_DATE,2020-08-17) przepisał kod do ustawiania daty autora do użycia fmt_ident(), zamiast ustawiania zmiennej środowiskowej i pozwalania na commit_tree()jej obsługę.
Ale wprowadził dwa błędy:

  • używamy ciągu wiadomości e-mail autora zamiast wiadomości e-mail osoby zatwierdzającej
  • podczas parsowania identyfikatora polecającego użyliśmy złej zmiennej do obliczenia długości wiadomości e-mail, w wyniku czego zawsze był to ciąg o zerowej długości

To zatwierdzenie naprawia oba, co powoduje, że testowanie tej opcji przez applybackend rebase " " kończy się sukcesem.

I:

rebase: napraw uszkodzony e-mail za pomocą --committer-date-is-author-date

Zgłoszone przez: VenomVendor
Podpisane przez: Jeff King

Commit 7573cec52c ("rebase -i: support --committer-date-is-author-date", 2020-08-17, Git v2.29.0-rc0 - merge wymienione w partii nr 13 ) skopiował kod analizujący ident-parsing committera od builtin/am.c.
Robiąc to, skopiował błąd, w którym zawsze ustawialiśmy wiadomość e-mail na pusty ciąg.

Poprawiliśmy wersję w git-ampoprzednim zatwierdzeniu; to zatwierdzenie naprawia skopiowany kod.

VonC
źródło