2014-12-30 9 views
10

C'è un modo per forzare git a non creare index.lock per operazioni di sola lettura come git status?Git: non creare index.lock per operazioni di sola lettura

Sto visualizzando lo stato del mio albero di lavoro in tmux, aggiornato ogni due secondi. Fondamentalmente analizzo l'output di git status --branch --ignored --porcelain e alcuni altri comandi. Il problema è che per i grandi repository git status possono essere necessari alcuni secondi. Durante questo periodo non posso eseguire altri comandi Git perché il repository è bloccato.

EDIT:

Ecco alcune immagini della parte rilevante della mia linea tmux. Descrizione per i simboli da sinistra a destra:

In sincronia con il ramo remoto | 2 modifiche graduali | 1 modifica non modificata | 5 file ignorati | 1 partita: enter image description here

In sincronia con il ramo remoto | nessuna modifica nell'albero di lavoro | 5 file ignorati: enter image description here

Un ramo remoto avanti di 1 commit | nessuna modifica nell'albero di lavoro | 5 file ignorati: enter image description here

+1

Buona domanda; 'status' blocca l'indice in modo che possa aggiornare la cache delle statistiche. Non vedo un modo ovvio di disattivarlo dalla documentazione, ma vale la pena di sapere cosa si sta arrendendo: le chiamate future di "status" dovranno ricalcolare il lavoro che sarebbe stato memorizzato nella cache. Questo potrebbe non essere ottimale nel tuo script. –

+0

Perdere il cacheing non è un problema per me. Come ho detto, è usato solo per visualizzare lo stato attuale dell'albero di lavoro. Eseguo 'git status' ogni tanto e poi comunque. –

+0

* Analizzo l'output di 'git status'.* Non dovresti farlo, perché 'git status' è * porcellana * (alto livello). Dovresti invece analizzare l'output dei comandi Git di livello inferiore. – Jubobs

risposta

9

Per quanto riguarda l'utilizzo della variabile di ambiente "GIT_INDEX_FILE" per consentire a git di utilizzare un altro file di indice?

Così, per creare un nuovo file di indice da utilizzare TESTA

GIT_INDEX_FILE=.git/other-index git reset 

e dopo di esso si può solo

GIT_INDEX_FILE=.git/other-index git status 

per ricerca per le modifiche.

Il lato negativo di esso, non vedrete lo stato reale se l'indice principale verrà modificato dai comandi aggiungi/rm. Ma almeno ti permetterà di rilevare il fatto di un cambiamento e quindi probabilmente farai dell'altro materiale per scoprire la vera differenza.

Potresti anche descrivere più dell'obiettivo che stai cercando di raggiungere? Probabilmente potremmo uscire con altre soluzioni.

Un'altra idea. Prova questo:

cp .git/index .git/other-index # or maybe just "ln" once, rather than copying everytime? 
GIT_INDEX_FILE=.git/other-index git status 

Non sei sicuro di file indice di come affidabile questo ... nel caso in cui se cp comando avverrà mentre si sta facendo git add/rm, si potrebbe avere "danneggiato", e apparentemente ottenere un fallimento, ma per l'uso Credo che sia abbastanza buono - potresti semplicemente ignorare il fallimento e riprovare.

+0

Ho aggiunto alcune immagini della mia riga di stato tmux. Tutto ciò che voglio veramente vedere in questa linea è lo stato corrente del repository. Le informazioni vengono aggiornate automaticamente ogni due secondi. Quindi in teoria posso seguire i cambiamenti in "tempo reale". –

+0

@keks, ho aggiornato la mia risposta con l'idea di 'cp'. Per favore, prova a dire se funziona bene, sono curioso. – kan

+0

Sembra che la versione cp funzioni come previsto. Non ho incontrato nessun problema finora. Anche se un indice danneggiato viene copiato, non è poi così male. Nel momento in cui avrei notato un errore, lo stato sarebbe stato già aggiornato comunque. –

4

Veloce e sporco ma più sicuro, è sufficiente utilizzare un utente con autorizzazioni di sola lettura.

sudo -u nobody git status 
Problemi correlati