2015-07-18 30 views
8

Vorrei ribadire un ramo sul ramo principale ma in modo tale che tutti i commit vengano visualizzati in ordine cronologico nel log git. È possibile senza git rebase --interactive e riorganizzando i commit manualmente?come rebase e mantenere i commit in ordine cronologico?

Sfondo: sto usando git per tenere traccia della configurazione fantoccio di una server farm. Il ramo principale è sempre in uno stato noto, in modo che tutti i server esistenti possano recuperare la loro configurazione dal server principale puppet.

Ogni nuovo server ha il proprio ramo, quindi ogni volta che lavoro sulla configurazione di un nuovo server, come cambiare un nome di dominio, configurare un certificato SSL, controllo il suo ramo e commetto tutte le configurazioni.

Dopo la nuova configurazione è completata, ho rebase i cambiamenti sulla diramazione maestro:

# git checkout new_config 
Switched to branch 'new_config' 
# git rebase master 
First, rewinding head to replay your work on top of it... 
Applying: fix routing rules 
Applying: fix netmask 
Applying: configure new ip address 
# git checkout master 
Switched to branch 'master' 
# git merge new_config 
Updating 21a3120..b0b79d7 
Fast-forward 
files/custom/xxxx | 45 +++++++++++++++++++++++++++++++++++++++++++++ 
files/custom/yyyy | 38 -------------------------------------- 
manifests/site.pp | 6 +++--- 
3 files changed, 48 insertions(+), 41 deletions(-) 
# 

I nuovi commit sono ora in cima al registro ma hanno i loro (passato) date originali. Ecco come si presenta:

commit b0b79d7924ec97e367664ccc26aaf0021916a30d 
Author: 
Date: Sun Jul 12 17:14:41 2015 +0200 

    configure new ip address 

commit f60d00abd57d6b8582f49bf1322efb88d44ee86e 
Author: 
Date: Fri Jul 10 13:19:45 2015 +0200 

    fix netmask 

commit 6eaae6c328faf55e5725f65a947bbb23ea29b166 
Author: 
Date: Fri Jun 12 14:05:25 2015 +0200 

    fix routing rules 

commit 21a31200e6694c640b2cb526d773af11cd703ff1 
Author: 
Date: Wed Jul 15 15:08:41 2015 +0200 

    (most recent commit on master before rebase) 

commit a7fa9cfa9c317fbbeb7dac8a89009c7d935fdd11 
Author: 
Date: Wed Jul 15 11:56:59 2015 +0200 

    (second most recent commit on master) 

Si noti come i vecchi timestamp del ramo impegna mostrare nella parte superiore del tronco, invece di essere uniti, più in basso nel registro in base alle loro date di commettere. Devo eseguire un altro git rebase --interactive per riorganizzare i commit in modo che il mio file di registro mostri tutti i commit in ordine cronologico.

+3

Potresti spiegare perché è importante per te che si impegna a presentarsi in ordine cronologico? –

+0

è il mio gusto personale. Trovo confuso se è ordinato in questo modo. – nn4l

risposta

3

La tua domanda è un po 'underspecified, perché git log smista sempre la sua uscita, ma takes options telling it how to sort:

Impegnarsi per l'ordinazione

Per impostazione predefinita, i commit sono mostrati in ordine cronologico inverso.

--date-order

    non mostrano genitori prima di tutti i suoi figli sono mostrati, ma per il resto spettacolo impegna nell'ordine commettere timestamp.

--author-date-order

    non mostrano genitori prima di tutti i suoi figli sono mostrati, ma per il resto spettacolo impegna nell'ordine autore timestamp.

--topo-order

    non mostrano genitori prima di tutti i suoi figli sono mostrati, e evitare di mostrare commit su più righe della storia mescolate.

Quindi, senza opzioni, le rappresentazioni git log si eseguono in ordine cronologico indipendentemente da cosa.

Io penso quello che stai chiedendo è, invece, come si può cambiamento i timestamp sui commit Ribasato. Per impostazione predefinita, rebase conserva i timestamp.

Si noti che ci sono due timbri su ciascun commit: la data dell'autore e la data del commit.


Il rebase documentation descrive queste due opzioni:

--committer-date-is-author-date, --ignore-date

    Questi flag vengono passati al git am di cambiare facilmente le date dei commit Ribasato (vedi git-am (1)). Incompatibile con l'opzione --interactive.

Consultando la git am documentation dà una migliore descrizione di questi:

--committer-date-is-author-date

    Per impostazione predefinita il comando registra la data del messaggio di posta elettronica, come la data di impegnarsi autore, e utilizza l'ora della creazione di commit come data del committer. Ciò consente all'utente di mentire sulla data del committer utilizzando lo stesso valore della data dell'autore.

--ignore-date

    Per impostazione predefinita il comando registra la data del messaggio di posta elettronica, come la data di impegnarsi autore, e usa il tempo di impegnarsi creazione come la data di committer. Ciò consente all'utente di mentire sulla data dell'autore utilizzando lo stesso valore della data del commit.

È possibile vedere sia l'autore e date committer utilizzando il formato fuller con git log, per esempio (git log --format=fuller).

Credo che vogliate usare --ignore-date, che fa sì che ogni commit successivo venga eseguito "al momento" (questo presuppone che io stia interpretando correttamente la vostra domanda!).

+0

Ho provato entrambe le opzioni ma 'git log' mostra ancora le nuove voci in cima. Ho chiarito la mia domanda iniziale per mostrare meglio ciò di cui ho bisogno. – nn4l

+0

Sto guardando il codice sorgente git e non sono sicuro di qualcosa; puoi ripetere l'output git quotato con '--format = fulller' in modo che mostri sia le date commit * che * author?O la documentazione sta mentendo sull'ordinamento per data (committer), o le date del tuo committer sono state cambiate in "now" con le date dell'autore lasciate da solo, in modo che '--commit-date-is-author-date' ti avrebbe ottenuto cosa volevi. – torek

1

Se si desidera mantenere le date originali, si è bloccati con il rebasing in base alle date.

Tuttavia, se si desidera creare una richiesta di pull e ottenere i commit ordinati correttamente in uno strumento che ordina in base alla data dell'autore (entrambi fanno sia TFS che GitHub), è possibile modificare le date.

di Windows: git rebase --force-rebase --exec "ping localhost -n 3" --exec "git commit --amend --date=now" master

Linux: git rebase --force-rebase --exec "sleep 2" --exec "git commit --amend --date=now" master

Nota che facendo git rebase --ignore-date master non funziona, perché la data ha solo seconda risoluzione e diversi commit otterrà la stessa data ed essere ordinati in un ordine non specificata . Se si utilizza --exec e --ignore-date insieme, il parametro --ignore-date verrà ignorato. Perché è incompatibile con la modalità interattiva, che utilizza --exec.

Problemi correlati