Niekedy môžete potrebovať opätovne podpísať predchádzajúce commity pomocou GnuPG. Tento proces prepisuje git históriu v zmysle zmeny hashov commitov. Navyše mení aj dátum, kedy bol commit vytvorený. Ak sa to neurobí správne, repozitár vyzerá, akoby nemal žiadnu históriu po podpísaní všetkej predchádzajúcej práce, keďže všetky commity by vyzerali, akoby boli pridané v tom istom okamihu. Takýto scenár ani nemôžete vytvoriť ručne, takže vyzerá veľmi neprirodzene.

Upozornenie: Pred pokračovaním sa absolútne uistite, že máte viacero záloh svojej práce. Nepodniknutie tohto kroku môže viesť k strate dát.

Uvažujte o nasledujúcom príkaze, ktorý sa bežne používa na podpisovanie predchádzajúcich commitov:

git rebase --exec 'git commit --amend --no-edit --no-verify -S' -i --root

Toto vytvorí nasledujúce interaktívne okno rebase (skrátené):

pick 60dcc7e insert posts sources
exec git commit --amend --no-edit --no-verify -S
pick 989ea13 fix sources links
exec git commit --amend --no-edit --no-verify -S
pick ce0cab2 move gcal push hook from gists to sources
exec git commit --amend --no-edit --no-verify -S
...

Po uložení a zatvorení proces rebase trvá niekoľko sekúnd. Výsledok možno skontrolovať takto:

git log --pretty=fuller

Zistíme, že vlastnosť AuthorDate zostala nedotknutá, ale CommitDate je nastavená na okamih spustenia príkazu:

commit 7c378e312bb6ab0f8265707be39f343cf04f6d25 (HEAD -> master)
Author:     Peter Babič <peter@peterbabic.com>
AuthorDate: Thu Nov 25 19:18:03 2021 +0100
Commit:     Peter Babič <peter@peterbabic.com>
CommitDate: Sun Nov 28 20:16:56 2021 +0100

    insert links

commit f32a1fc98c829c6ee8bb8dbcda46345f2c00dedd
Author:     Peter Babič <peter@peterbabic.com>
AuthorDate: Wed Jul 28 21:57:02 2021 +0200
Commit:     Peter Babič <peter@peterbabic.com>
CommitDate: Sun Nov 28 20:16:54 2021 +0100

    insert post cypress husky stop-only

commit 86c263cb83bb629c5f9dd20d81808a21c83f1ff8
Author:     Peter Babič <peter@peterbabic.com>
AuthorDate: Thu Jul 15 19:56:13 2021 +0200
Commit:     Peter Babič <peter@peterbabic.com>
CommitDate: Sun Nov 28 20:16:52 2021 +0100

    update source to show differences

...

Keďže som si myslel, že existuje jediný príkaz na obídenie tohto problému, mal som ťažké časy. Keď som to pokazil, mohol som sa vždy vrátiť a začať odznova pohľadom na posledný záznam v git reflog, zaznamenaním jeho čísla a resetovaním stavu repozitára pomocou:

git reset --hard HEAD@{xx}

Pokus a omyl trvali nejaký čas, kým som neskúšal rôzne príkazy, až kým som nenašiel tento málo docenený klenot. Toto je jediné miesto, kde som našiel, že proces vyžaduje dva príkazy rebase spúšťané jeden po druhom, pričom druhý je pridaný tu:

git rebase --exec 'git commit --amend --no-edit --no-verify -S' -i --root
git rebase --committer-date-is-author-date -i --root

Vyššie uvedený príkaz opravuje CommitDate tak, aby zodpovedala AuthorDate po prvom rebase, skontrolujte sami:

git log --pretty=fuller

Teraz AuthorDate a CommitDate dokonale súhlasia:

commit ee8972f2ca725cfe297417f5cd5ed76816b4b0bc (HEAD -> master, origin/master)
Author:     Peter Babič <peter@peterbabic.com>
AuthorDate: Thu Nov 25 19:18:03 2021 +0100
Commit:     Peter Babič <peter@peterbabic.com>
CommitDate: Thu Nov 25 19:18:03 2021 +0100

    insert links

commit 583d8b7a934f10faa6ee574180192e4e2b98e706
Author:     Peter Babič <peter@peterbabic.com>
AuthorDate: Wed Jul 28 21:57:02 2021 +0200
Commit:     Peter Babič <peter@peterbabic.com>
CommitDate: Wed Jul 28 21:57:02 2021 +0200

    insert post cypress husky stop-only

commit 0760e7be4286f6b607243b1c712828d0161311e0
Author:     Peter Babič <peter@peterbabic.com>
AuthorDate: Thu Jul 15 19:56:13 2021 +0200
Commit:     Peter Babič <peter@peterbabic.com>
CommitDate: Thu Jul 15 19:56:13 2021 +0200

    update source to show differences

...

Možno existuje spôsob, ako to urobiť v jedinom rebase bez potreby dvoch samostatných, ale nenašiel som ho. Každopádne, jeden alebo dva príkazy, nezáleží na tom, pokiaľ sa práca vykoná – pokiaľ to nerobíte pre tisíce commitov, pretože proces je trochu časovo náročný. Majte na pamäti, že prepisovanie tisícok commitov by bolo prinajmenšom podozrivé. Po tejto aktivite zostane stopa:

git log --show-signature

Čo produkuje mierne odlišný výstup:

commit 819bd4412b97f295dac5c958b18464d38accb94b (HEAD -> master)
gpg: Signature made Sun 28 Nov 2021 20:26:29 CET
gpg:                using RSA key 0575E586224E3E33CF1A3EE34BB075BC1884BA40
gpg: Good signature from "Peter Babic <peter@peterbabic.com>" [ultimate]
Primary key fingerprint: A44B 03E6 42BB 4223 6780  FEA4 3A13 81FC F273 8E75
     Subkey fingerprint: 0575 E586 224E 3E33 CF1A  3EE3 4BB0 75BC 1884 BA40
Author: Peter Babič <peter@peterbabic.com>
Date:   Thu Nov 25 19:18:03 2021 +0100

    insert links

commit 24634bdeafda0cbddb7c3e7dec368762a3e790b5
gpg: Signature made Sun 28 Nov 2021 20:26:28 CET
gpg:                using RSA key 0575E586224E3E33CF1A3EE34BB075BC1884BA40
gpg: Good signature from "Peter Babic <peter@peterbabic.com>" [ultimate]
Primary key fingerprint: A44B 03E6 42BB 4223 6780  FEA4 3A13 81FC F273 8E75
     Subkey fingerprint: 0575 E586 224E 3E33 CF1A  3EE3 4BB0 75BC 1884 BA40
Author: Peter Babič <peter@peterbabic.com>
Date:   Wed Jul 28 21:57:02 2021 +0200

    insert post cypress husky stop-only

commit 86a49348e4a870f0fc4e7894d9766dc72acb1482
gpg: Signature made Sun 28 Nov 2021 20:26:27 CET
gpg:                using RSA key 0575E586224E3E33CF1A3EE34BB075BC1884BA40
gpg: Good signature from "Peter Babic <peter@peterbabic.com>" [ultimate]
Primary key fingerprint: A44B 03E6 42BB 4223 6780  FEA4 3A13 81FC F273 8E75
     Subkey fingerprint: 0575 E586 224E 3E33 CF1A  3EE3 4BB0 75BC 1884 BA40
Author: Peter Babič <peter@peterbabic.com>
Date:   Thu Jul 15 19:56:13 2021 +0200

    update source to show differences

...

Vyššie uvedené zobrazuje Date správne, avšak gpg: Signature made je uložené v okamihu vykonania rebase. Nepokúsil som sa to obísť, pretože som bol s výsledkom celkom spokojný. Po zamyslení by možno ani nedávalo zmysel mať niečo podpísané kľúčom z “budúcnosti”. Enjoy!

Odkazy #