Per impostazione predefinita, git rebase imposterà il timestamp del committer sul momento in cui viene creato il nuovo commit, ma manterrà intatto il timestamp dell'autore. Il più delle volte, questo è il comportamento desiderato, ma in alcuni scenari, non vogliamo nemmeno cambiare il timestamp del committer. Come possiamo realizzarlo? Bene, ecco il trucco che faccio di solito.
Innanzitutto, assicurati che ciascuno dei commit che stai per riformulare abbia un messaggio di commit unico e un timestamp dell'autore (Qui è dove il trucco ha bisogno di miglioramenti, ma al momento è adatto alle mie esigenze).
Prima del rebase, registra il timestamp del committer, il timestamp dell'autore e il messaggio di commit di tutti i commit che verranno riassegnati in un file.
#NOTE: BASE is the commit where your rebase begins
git log --pretty='%ct %at %s' BASE..HEAD > hashlog
Quindi, lascia che abbia luogo il rebase effettivo.
Infine, sostituiamo il timestamp del committer corrente con quello registrato nel file se il messaggio di commit è lo stesso usando git filter-branch
.
git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%at %s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_COMMITTER_DATE=$__date || cat'
Se qualcosa va storto, basta fare il checkout git reflog
o tutti gli refs/original/
ref.
Inoltre, puoi fare qualcosa di simile al timestamp dell'autore.
Ad esempio, se il timestamp di alcuni commit dell'autore è fuori servizio e senza riorganizzare questi commit, vogliamo solo che il timestamp dell'autore venga visualizzato in ordine, quindi i seguenti comandi aiuteranno.
git log --pretty='%at %s' COMMIT1..COMMIT2 > hashlog
join -1 1 -2 1 <(cat hashlog | cut -f 1 | sort -nr | awk '{ print NR" "$1 }') <(cat hashlog | awk '{ print NR" "$0 }') | cut -d" " -f2,4- > hashlog_
mv hashlog_ hashlog
git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_AUTHOR_DATE=$__date || cat'