2010-11-14 15 views
18

Ho effettuato un commit circa un mese fa che prevedeva la creazione di una nuova cartella e sottocartelle e il trasferimento dei file del codice sorgente tra loro. Stavo solo guardando la mia storia per la prima volta da allora e ho capito che Git ha "perso" la cronologia da quando i file originali sono stati cancellati e poi ri-aggiunti, suppongo - cioè quando visualizzo un file nella mia GUI git (è sotto NDA quindi non posso discuterlo direttamente, ma per esempio questo repository è rotto anche su GitHub. GitHub mostra chiaramente il suo rilevamento del commit come una serie di mosse.) mostra solo la cronologia per ogni file fino a quando la cartella del progetto è stato riorganizzato.Cronologia dimenticata git dopo la riorganizzazione della cartella del progetto

Dopo aver letto alcune domande (Getting Git to Acknowledge Previously Moved Files, How to make git mark a deleted and a new file as a file move?), sono semplicemente più perso di quando ho iniziato. Sembra che da quelle risposte non sarò in grado di risolvere tutto questo? Apprezzo davvero qualsiasi aiuto qui.

+3

@ JUST: La tua opinione non è corretta questa volta. SO è assolutamente il posto giusto per le domande sul controllo della versione. Sicuramente i collegamenti dell'OP alle precedenti domande git suggeriscono questo? Basta guardare le FAQ: "strumenti software comunemente usati dai programmatori". Immagino sia il tuo voto ravvicinato - forse dovresti dare un'occhiata alla pagina delle FAQ e dei privilegi prima di esercitare nuovamente questo privilegio. – Cascabel

+0

@Jefromi: ti sento, ma poiché "set di tag" è arrivato, ho interrotto questo tipo di battaglia;) Vedi http://blog.stackoverflow.com/2010/11/stack-overflow-homepage-changes/#comment -51797. Possono spostare quelle domande praticamente ovunque vogliono ... Vedrò * loro *) – VonC

+0

@VonC: direi che dovremmo ancora provare a mantenere le domande in un posto, se non per noi, per le persone alla ricerca di risposte. – Cascabel

risposta

9

In Git non esiste il concetto di spostamento del file.

Alcuni strumenti, come GitHub, considerano un commit contenente un file denominato X che è stato eliminato e un file denominato X che è stato creato per spostare un file.

Secondo Linus Torvalds, il trasferimento di file è solo un caso speciale di refactoring; per questo motivo Git non la tratterà diversamente. La gestione di questo caso speciale, come molti altri, viene lasciata agli strumenti di livello superiore (come i frontend).

Per ulteriori informazioni su questo argomento, controllare this answer da Linus Torvalds.

+2

Non conosco Git in generale, ma Github perde la cronologia di un file se lo sposti. Sto vedendo questo problema in uno dei miei repository github ora dove ho spostato un'intera struttura di directory e tutti i file in esso ora appaiono come aventi 1 elemento nella loro storia. – Powerlord

+0

Il link nella tua risposta è morto, hai un'altra fonte? O puoi semplicemente postare l'intera citazione? – ProgrammerAtWork

+0

Nessun'altra fonte oltre al collegamento fornito. Sembra che l'intero http://permalink.gmane.org/ non funzioni come previsto –

0

Se in realtà mancano delle revisioni dalla cronologia (non è completamente chiaro dalla domanda che cosa manca in realtà) ed è trascorso solo un mese, probabilmente hai ancora tempo - guarda il reflog; conserva una copia di ogni riferimento che hai controllato, quindi se commetti un errore puoi recuperare ciò che avevi prima.

L'impostazione predefinita è di mantenere le voci di reflog per 90 giorni, che sono scaduti da git gc.

git help reflog 
+0

Avrei dovuto essere più chiaro - Non mi mancano i dati, ma quando provo a visualizzare la cronologia di un determinato file nella mia GUI git, viene mostrato solo al mio commit 'riorganizzazione' – refulgentis

2

Hai provato le impostazioni config diff.renames?

diff.renames 

Indica git per rilevare rinomina. Se impostato su qualsiasi valore booleano, abiliterà il rilevamento di ridenominazione di base. Se impostato su "copia" o "copia", rileverà anche le copie.

Nota: per seguire la cronologia di un singolo file attraverso rinomina, è necessario utilizzare "git log -p --follow file".

+0

Sembra che TC abbia effettivamente cancellato un file e quindi lo abbia ripristinato in seguito (o qualcosa del genere), il che significa che Git non lo rileva come rinominare. – erjiang

+0

Ho fatto - no a dadi. Questo repository è 'rotto' anche su GitHub, se riesco a far leggere GitHub correttamente, sarò felice. – refulgentis

0

Vorrei eseguire uno script che attraversasse tutti gli oggetti. Dovresti prima decomprimere tutti i file del pacchetto. Lo script controllerebbe il tipo, se è un commit vedresti se sei l'autore. Quindi controlla la data. Elenca quelli e grep per il nome del file che desideri. Una volta che avete il commit di interesse, creare un ramo con

git branch RecoveredWork hash-of-your-commit 

e vedere se si dispone di tutto ciò che si vuole con

git log RecoveredWork --graph --decorate 

da qui si consiglia di fare un po 'di filtro ramificazione, l'innesto e/o rebasing per collegare nuovamente la storia.

2

Per quanto vedo io si desidera:

git log --follow some_file.cpp 

Vedi http://git-scm.com/docs/git-log per i dettagli. Non sono sicuro che sia quello che vuoi; ma in caso di git, git tiene traccia dei contenuti non dei file. Il problema è che determinare quell'informazione è davvero costoso e si presume che normalmente non ne abbia bisogno ...

0

Posso pensare a qualche possibilità. Se le cose sono state solo mischiate, ma non tracciare, presumo che ciò sia avvenuto in due commit diversi ... uno da rimuovere e poi uno da aggiungere nuovamente. Crea un nuovo ramo nel commit prima di quello, carica i prossimi due commit come un commit e poi aggiungi tutto dopo.

Se questo non è il caso, potrebbe essere necessario guardare i commit con git log -M -C

2

Se si desidera spostare le cartelle in giro in git, è possibile utilizzare git mv.

Avevo un sacco di cartelle nella radice del mio repository e volevo spostarle in due sottodirectory, così ho creato le due nuove directory usando ** mkdir.

Poi mi sono trasferito i file e le cartelle uno alla volta nella nuova directory come questo:

git mv folder1/ newDirectory1/ 
git mv file1.txt newDirectory2/ 

ecc

ho avuto un caso in cui ho voluto cambiare titolo una delle directory per src e l'ho fatto in questo modo:

git mv folder2 newDirectory1/src 

Ciò ha provocato una serie di file che si presentava così:

repository/ 
    newDirectory1/ 
     folder1/ 
     src/ 
    newDirectory2/ 
     file1.txt 

Dopo aver terminato, ho creato un nuovo ramo chiamato "riorganizzato" in modo da non interferire con il lavoro svolto da un altro sviluppatore nel ramo principale. Ha continuato a lavorare sui file e, quando ha apportato nuove modifiche al master, ho tirato e fuso le modifiche nel mio ramo e tutto ha funzionato come speravo. I file che erano stati spostati sono stati referenziati correttamente dalle loro posizioni originali e hanno ricevuto i loro commit.

Problemi correlati