Per impostazione predefinita, git rebase sarà imposta il timestamp del committer al momento in cui viene creato il nuovo commit , ma mantiene intatto il timestamp dell'autore. La maggior parte del tempo, questo è il comportamento desiderato, ma in alcuni scenari, non vogliamo modificare timestamp del committente. Come possiamo riuscirci? Bene, ecco il trucco che faccio di solito.
In primo luogo, assicurarsi che ciascuno dei commit che state per rebase ha un unico messaggio di commit e autore timestamp (Questo è dove si ha bisogno di trucco miglioramenti, attualmente si adatta alle mie esigenze però).
Prima del rebase, registra il timestamp del committer, il timestamp dell'autore e il messaggio di commit di tutti i commit che verranno ridefiniti in un file.
#NOTE: BASE is the commit where your rebase begins
git log --pretty='%ct %at %s' BASE..HEAD > hashlog
Quindi, lasciare che il valore effettivo abbia luogo.
Infine, sostituiamo il timestamp del commit corrente con quello registrato nel file se il messaggio di commit è lo stesso utilizzando 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 checkout git reflog
o tutti i refs/original/
arbitri.
Furthormore, puoi fare la stessa cosa con il timestamp dell'autore.
Per esempio, se timestamp dell'autore di alcuni commit sono fuori uso, e senza riorganizzare queste commit, vogliamo solo timestamp dell'autore di mostrare in ordine, poi 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'
È strano che la risposta alla domanda sia davvero "non è necessario fare nulla - funziona come impostazione predefinita". Ma ora supponiamo di volere che il commit venga ordinato in ordine di data corretto mentre si fa rebase (che è uno scenario piuttosto naturale se ci si pensa). Ora, non sono riuscito a trovare il modo per ottenerlo e ho postato il mio q come http://stackoverflow.com/questions/12270357/really-flatten-a-git-merge – pfalcon
David menziona un'altra opzione per ripristinare la data del commit: 'git rebase --committer-date-is-author-date SHA'. Vedi [la mia risposta modificata sotto] (http://stackoverflow.com/a/2976598/6309) – VonC
Ho appena scritto una [risposta esauriente] (http://stackoverflow.com/a/30819930/4265352) su un [simile domanda] (http://stackoverflow.com/q/30790645/4265352) il cui autore ha provato le risposte spiegate qui e non ha potuto applicarle in modo soddisfacente. – axiac