2012-01-31 13 views
7

Al lavoro dobbiamo fare i conti con un repository git molto grande (90Go). Dopo aver provato a modificare alcune cose sulla mia copia locale (ho avuto errori con un file pack, ho provato a decomprimerlo), avrei potuto cancellare alcuni file oggetto. Per esempio:Git: recuperare un oggetto specifico da un telecomando

> git gc

error: Could not read af9ed8[:snip:]

fatal: bad tree object af9ed8[:snip:]

error: failed to run repack

Come posso prendere un oggetto specifico (in questo caso quella con l'af9ed8 hash ...) da un repository remoto?

+1

So che questo non risponde alla tua domanda, ma si potrebbe considerare suggerendo frazionamento che repo! Se è così grande ora, sarà solo più grande, e wow, ci vorrà molto tempo per clonare. – Cascabel

+0

Cosa succede se si esegue 'git fetch origin'? Cerca di recuperare troppi oggetti? – Cascabel

+0

@Jefromi Questo è praticamente non classificabile ^^. La procedura è solo copiando in modo crudo il repository. Mi piacerebbe farlo dividere, ma sarebbe un lavoro incredibile, paralizzando la squadra per tutto il tempo e non è quello che faranno i responsabili. Non sono responsabile per questo (sono un po 'nuovo ...). Sono abituati a farcela: sospiro: ... –

risposta

4

Se si ha accesso filesystem al o qualsiasi altro repository intatta remota che contiene questo oggetto, si dovrebbe essere in grado di andare lì ed eseguire:

git cat-file tree af9ed8 > 9ed8... 

Si noti che questo richiede solo accesso in sola lettura ai il repository (puoi scrivere il file altrove) quindi dovrebbe essere molto sicuro, e potresti anche farlo come utente che non ha i permessi di scrittura sul filesystem. È quindi possibile trasferire/copiarlo nella posizione appropriata nel proprio repo:

cp path/to/9ed8... .git/objects/af/9ed8... 

oggetti allentati sono memorizzati nella directory con le prime due cifre del hash; i nomi dei file sono il resto dell'hash.

Edit: Se l'oggetto è sciolto sul lato remoto si potrebbe anche solo copiare direttamente fuori .git/objects, ma se è ricco, che avrebbe dovuto scompattarlo con git unpack-objects, e immagino le packfiles in che repo sono enormemente proibitivo. Il modo migliore per farlo sarebbe quello di copiare il pacchetto nel repository danneggiato, eliminare eventuali oggetti danneggiati e quindi utilizzare git unpack-objects < packfile, che non decomprimerà alcun oggetto già esistente.

non sono sicuro di come farlo tramite normali comandi remoti; anche il livello inferiore git fetch-pack funziona ancora a un livello di riferimento, recuperando un pacchetto con i commit necessari per completare il ref. Sospetto che potresti essere in grado di fare qualcosa di nascosto come cancellare tutti gli oggetti commit che fanno riferimento a quell'albero (git fsck potrebbe aiutarti a trovarli). Speravo davvero che potessi essere in grado di creare un tag che punta a quell'oggetto, spingerlo al telecomando, quindi provare a recuperare il tag dal telecomando (convincendolo a recuperare l'oggetto) ma sembra che Git stia abbastanza attento a non consente di creare o manipolare un tag che punta a un oggetto inesistente.

+0

Mi dice che quando provo a sfoltire di nuovo che l'oggetto af9ed8 ... del mio repository locale è danneggiato. –

+0

Prugna? Intendi 'git gc'? Forse dovresti iniziare con 'git fsck'. E dice che l'oggetto è corrotto dopo che ne hai copiato uno intatto da un altro repository? (Non sono sicuro di voler eseguire 'git gc' su un repo così grande, ci vorrà ancora un po 'di tempo.) – Cascabel

+0

Beh, git gc mi dà la stessa risposta. Penso che mi sto arrendendo ... –

Problemi correlati