2016-07-08 20 views
9

Ho accidentalmente cancellato .git/index, c'è un modo per recuperarlo? È eliminato definitivamente. Non ho ancora impegnato nulla.Come recuperare `.git/index` localmente?

+1

quindi è un repository pulito - basta cancellare l'intera directory e creare un nuovo repo? –

+0

Hai già aggiunto qualcosa all'indice? Esistevano versioni particolari dei file che si desidera ripristinare e che sono stati messi in scena ma diversi dalla copia che si trova ora nell'albero di lavoro? –

risposta

2

Non penso sia possibile, non via git in ogni caso (si può provare a guardare all'interno della directory del Cestino o qualsiasi mezzo di ripristino offerto dal filesystem). Otterrai un nuovo indice, tuttavia, non appena avrai impostato git add o esegui qualcos'altro che richiede l'indice.

Se hai perso uno qualsiasi dei file che hai git add Ed, si può passare attraverso ./git/objects (find .git/objects/ -type f |sed 's:\.git/objects/::; s:/::' ), ispezionare il contenuto di ogni con git cat-file -p $the_hash, e una volta che hai trovato quello perduto , reindirizzare l'output in un file.

(Quando si git add, una voce di nome di file va a .git/index e il contenuto del file vengono memorizzati in .git/objects/. Indice di Git è fatto delle voci dei nomi di file di un oggetto albero aspiranti che viene creato quando si commit. È possibile visualizzare una rappresentazione leggibile dall'uomo dell'indice con git ls-files --stage).

+1

L'indice ha un po 'più di roba in esso, ma sì, è fondamentalmente una cache di name-and-hash-es. Per completezza, vale la pena menzionare che l'indice ha quattro possibili "slot" per nome: gli slot 1-3 sono usati solo durante un'unione in conflitto, e lo zero dello slot è dove va la normale, next-commit-to-make. – torek

2

È possibile recuperare l'indice dall'ultimo checkout con git reset. Qualsiasi contenuto aggiunto da allora è ancora aggiunto, è nel repository, ma l'indice era l'unico posto in cui è stata registrata l'associazione di percorso e contenuto. Puoi avere git fsck eliminare gli oggetti non raggiungibili in una directory lost'n'found, vedi its docs, quindi il percorso più rapido su un territorio familiare è semplicemente rilasciare nuovamente il contenuto nel worktree e aggiungerlo di nuovo, git non duplicherà i contenuti ma recupererà la voce di indice.

8

Per ricostruire il file di indice, è possibile provare questi due comandi:

git reset   # re-scan the working directory 
git add -u  # update the index