2014-05-21 21 views
6

Sto facendo un log git per elencare tutti i commit e quindi analizzarli. Con questo comando:Trova la data per il commit non datato?

git log --encoding=UTF-8 --date=local --pretty=format:'%H,%P,%at,%ct,%an,%s' 

In alcuni pronti contro termine strani ottengo impegna senza la data sia l'autore e commettere date. Ho provato con la semplice:

git log 

e quello che ho ottenuto è stato un appuntamento al 1970.

Un repository in cui ciò accade è SamWM/jQuery-Plugins, ad esempio nel commit e9dddaf24c9de45d9b4efdf38eff7c30eb200f48.

Anche se in GitHub abbiamo un appuntamento interessante quando andiamo a cercarlo.

Qualcuno può aiutarmi a ottenere una data interessante per questo impegno che dovrebbe essere da qualche parte nel mezzo degli altri?

risposta

4

git show --format=raw spettacoli:

 
commit e9dddaf24c9de45d9b4efdf38eff7c30eb200f48 
tree d63aeb159635cb231e191505a95a129a3b4a7b38 
parent 9276202f1c0dcc360433df222c90f7874558f072 
author SamWM <[email protected]> 1288370243 --700 
committer SamWM <[email protected]> 1288370243 --700 

Le informazioni fuso orario qui non è valido, e io non sono sicuro di come lui autore è riuscito a creare questo. Altri commit utilizzano il formato corretto -0700.

È possibile convertire questa data utilizzando GNU, con la consapevolezza che --700 si suppone essere -0700:

 
$ TZ=Etc/GMT+7 date -d @1288370243 
Fri 29 Oct 09:37:23 GMT+7 2010 

quindi la risposta corretta in formato consueto di Git è Fri 29 Oct 09:37:23 2010 -0700.

Nota: sto utilizzando TZ=Etc/GMT+7, non GMT-7. Puoi vedere eseguendo lo stesso comando con commit diversi che hanno informazioni corrette sul fuso orario che il risultato è esattamente come dovrebbe essere. La conversione del fuso orario di date è esattamente la direzione sbagliata per ciò che è necessario qui, e annullando l'offset sto annullando l'errore.

È possibile, in una copia locale, correggere tali commit utilizzando git hash-object e git replace. In primo luogo, un controllo di integrità che i miei comandi sono in ordine:

 
$ git cat-file commit e9dddaf24c9de45d9b4efdf38eff7c30eb200f48 | 
> git hash-object -t commit -w --stdin 
e9dddaf24c9de45d9b4efdf38eff7c30eb200f48 

Questo comando caricato il specificato commettere, ha scritto nuovamente modificato, e ha mostrato il riscritta di commettere hash. Sto usando questo come controllo di integrità mentale: se avessi un hash diverso, qualcosa dovrebbe essere sbagliato nel mio comando.

Ora, è possibile inserire qualcosa per creare un fisso commettere:

 
$ git cat-file commit e9dddaf24c9de45d9b4efdf38eff7c30eb200f48 | 
> sed -e 's/--700/-0700/' | 
> git hash-object -t commit -w --stdin 
46694249ed3d519b0c934222520b9dc6d8557fa1 

e l'uso che fissa commettere invece:

 
$ git replace e9dddaf24c9de45d9b4efdf38eff7c30eb200f48 46694249ed3d519b0c934222520b9dc6d8557fa1 

Dopo di che, tutti i riferimenti a e9dddaf24c9de45d9b4efdf38eff7c30eb200f48 guarderanno 46694249ed3d519b0c934222520b9dc6d8557fa1 invece e git show e9dddaf24c9de45d9b4efdf38eff7c30eb200f48 ora inizia con:

 
commit e9dddaf24c9de45d9b4efdf38eff7c30eb200f48 
Author: SamWM <[email protected]> 
Date: Fri Oct 29 09:37:23 2010 -0700 

    Update version number, make text formatting and indentation consistent with the rest of the code 
+0

@rt fpessoa È necessario utilizzare raw per controllare il problema, ma è possibile risolvere localmente il problema in modo che non ne risentirai mai più, e ho modificato la mia risposta per mostrare come. – hvd

+0

@rtfpessoa Non è necessario passare al repository, è possibile creare i nuovi oggetti nel proprio clone locale di quel repository come ho fatto io e si vedono ancora gli ID di commit originali. – hvd

+0

@rtfpessoa È vero, è davvero una soluzione molto specifica, ma è anche una situazione molto specifica. Non ho mai visto nulla di simile prima o letto su di esso, mai; Sono abbastanza sicuro che questo non sia un bug diffuso e pochissimi repository ne saranno influenzati. L'hai visto in più repository, forse contengono commit dallo stesso autore? – hvd

Problemi correlati