2014-12-30 31 views
10

Gibt es eine Möglichkeit, git zu zwingen, index.lock für schreibgeschützte Operationen wie git status nicht zu erstellen?Git: index.lock für schreibgeschützte Operationen nicht erstellen

Ich zeige den Status meines Arbeitsbaums in tmux an und werde alle paar Sekunden aktualisiert. Grundsätzlich parse ich die Ausgabe von git status --branch --ignored --porcelain und ein paar andere Befehle. Problem ist, dass für große Repositories git status ein paar Sekunden dauern kann. Während dieser Zeit kann ich keine anderen Git-Befehle ausführen, da das Repository gesperrt ist.

EDIT:

Hier sind einige Bilder von dem betreffenden Teil meiner tmux Linie. Beschreibung für Symbole von links nach rechts:

In Synchronisation mit Remote Branch | 2 gestufte Änderungen | 1 nicht geänderte Änderung | 5 ignorierte Dateien | 1 Stash-Eintrag: enter image description here

Synchron mit Remote-Zweig | keine Änderungen im Arbeitsbaum | 5 ignorierte Dateien: enter image description here

Ahead Remote-Zweig von 1 commit | keine Änderungen im Arbeitsbaum | 5 ignorierte Dateien:

+1

Gute Frage; 'status' sperrt den Index, so dass der Statistik-Cache aktualisiert werden kann. Ich sehe keinen offensichtlichen Weg, das aus der Dokumentation zu entfernen, aber es ist wert zu wissen, was du aufgibst: zukünftige Status-Aufrufe müssen die Arbeit neu berechnen, die zwischengespeichert worden wäre. Dies ist möglicherweise nicht optimal in Ihrem Skript. –

+0

Der Cache zu verlieren ist kein Problem für mich. Wie gesagt, es wird nur verwendet, um den aktuellen Status des Arbeitsbaums anzuzeigen. Ich laufe trotzdem 'git status'. –

+0

* Ich analysiere die Ausgabe von 'git status'.* Das solltest du nicht machen, denn 'git status' ist * Porzellan * (High-Level). Sie sollten stattdessen die Ausgabe von Git-Befehlen niedrigerer Ebene analysieren. – Jubobs

Antwort

9

Worum geht es bei der Verwendung der Umgebungsvariablen "GIT_INDEX_FILE", damit der Git eine andere Indexdatei verwendet?

So wurde eine neue Indexdatei von HEAD

GIT_INDEX_FILE=.git/other-index git reset 

erstellen und danach konnte man nur

GIT_INDEX_FILE=.git/other-index git status 

für Änderungen nachzuschlagen.

Der Nachteil davon ist, dass Sie den tatsächlichen Status nicht sehen werden, wenn der Hauptindex durch add/rm-Befehle geändert wird. Aber zumindest erlaubt es Ihnen, die Tatsache einer Veränderung zu erkennen und dann wahrscheinlich noch mehr zu tun, um den wirklichen Unterschied herauszufinden.

Können Sie auch mehr über das Ziel beschreiben, das Sie erreichen möchten? Wahrscheinlich könnten wir mit anderen Lösungen kommen.

Eine andere Idee. Versuchen Sie folgendes:

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

nicht sicher, wie zuverlässig diese ... für den Fall, wenn cp Befehl geschehen wird, während Sie git add/rm tun, könnten Sie „beschädigt“ Indexdatei haben, und anscheinend einen Fehler, aber für die Nutzung Ich glaube, es ist gut genug - Sie könnten einfach den Fehler ignorieren und es erneut versuchen.

+0

Ich habe ein paar Bilder von meiner tmux-Statuszeile hinzugefügt. Alles, was ich wirklich in dieser Zeile sehen möchte, ist der aktuelle Zustand des Repositories. Die Informationen werden automatisch alle paar Sekunden aktualisiert. In der Theorie kann ich Änderungen in "Echtzeit" verfolgen. –

+0

@keks, ich habe meine Antwort mit 'cp' Idee aktualisiert. Bitte versuchen Sie zu sagen, wenn es gut funktioniert, bin ich neugierig. – kan

+0

Sieht so aus, als ob die cp-Version wie erwartet funktioniert. Ich habe bisher keine Probleme festgestellt. Selbst wenn ein beschädigter Index kopiert wird, ist das gar nicht so schlimm. Zu dem Zeitpunkt, an dem ich einen Fehler bemerken würde, wäre der Status sowieso schon aktualisiert worden. –

4

Schnell und schmutzig, aber am sichersten können Sie einfach einen Benutzer mit Nur-Lese-Berechtigungen verwenden.

sudo -u nobody git status