2010-07-01 14 views
11

Sono sicuro che questo può essere fatto (?) (In clearcase sarebbe abbastanza semplice).git: come recuperare tutti i file a partire da una certa data

+3

Nota: sistemi distribuiti (come Git) le date e gli orari registrati potrebbero non essere affidabili o accurati al 100% poiché possono essere registrati su una miriade di macchine. Speriamo che la maggior parte delle macchine siano ragionevolmente vicine al "tempo reale", ma potrebbero esserci strane anomalie in agguato nella rete di contributori. –

risposta

4

Non dimenticare file timestamp are not recorded in un DVCS come Git.
Sono disponibili solo timestamp di commit e puoi effettuare facilmente il checkout di un commit da una certa data.

git checkout [email protected]{1 month 2 weeks 3 days 1 hour 1 second ago} 

(Nota: una tale cassa darebbe una detached HEAD)


In ClearCase, questo è facile a condizione che si imposta l'opzione "preservare il tempo di file" a true.
(se non, è in realtà di registrare il tempo di arrivo di ogni file, che è un po 'come la git commit timestamp, tranne che per ogni file)

+0

Ok, ma c'è un'ulteriore complicazione. Il mio repository è un clone di un repository remoto. Quando do una data, dice che il log ritorna solo alla data in cui il mio repository è stato clonato. Come posso utilizzare la cronologia del repository remoto? –

+0

@steve: utilizzando il refspec remoto anziché uno locale. Vedi http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html#_specifying_revisions: 'git checkout/refs/remotes/master @ {...}' – VonC

+0

fatale: '/ refs/remote/master @ {2010-06-04}' è esterno al repository –

12

Usa git log per determinare una revisione adatto per passare, ad esempio:

git log --since='2010-04-01' --until='2010-04-02' 

Questo mostrerà tutti i commit del 2010-04-01, quindi scegli quello che corrisponde all'istante in cui desideri i file e prendi nota del suo ID di commit. Quindi basta usare git checkout COMMIT-ID per commutare lo spazio di lavoro su quel commit. Questo scollegherà il tuo spazio di lavoro (HEAD) dal ramo corrente, usa git checkout master per tornare.

+0

Attualmente ho riscontrato il problema che 'git checkout master @ {}' non funziona (dato che la data selezionata non è nel reflog). La tua soluzione risolverebbe questo problema, ma questa è la * sola * soluzione a questo? Sembra un pò goffo usare due comandi con un po 'di analisi in mezzo. – exhuma

+0

... Suppongo che qualcosa del genere funzioni: 'git checkout $ (git log -n 1 --until = '2017-04-02: 00: 00: 00' --pretty = '% H')' ma sembra ancora piuttosto hacky. – exhuma

2

prima, si deve ottenere la stringa che identifica il commit:

git rev-list -n 1 --before="2009-07-27 13:37" origin/master 

si stampa la stringa (per esempio XXXX), copiarlo e fare questo comando:

git checkout XXXX 
Problemi correlati