2010-12-15 11 views
1

Ich schreibe ein Skript, um Dinge wie git status in jedem der Unterverzeichnisse des aktuellen Verzeichnisses zu laufen, so kann ich schnell Informationen über mehrere Git-Repos erhalten. Ich möchte jedoch alle Befehle verhindern, die die Repos modifizieren. Ich würde nicht zehn Repos gleichzeitig machen wollen. Ich kann nicht einfach eine Whitelist von git-Unterbefehlen verwenden, weil ich vielleicht git branch -a ausführen möchte, um die Verzweigungen in jedem Repo zu sehen, aber nicht git branch new-branch-name, um in jedem Repo eine neue Verzweigung zu erstellen.Gibt es eine Möglichkeit, git im schreibgeschützten Modus auszuführen?

Gibt es also eine Möglichkeit, git so zu starten, dass es abbricht, anstatt irgendwelche Änderungen am Repo vorzunehmen, aber gut funktioniert, wenn schreibgeschützte Befehle ausgeführt werden?

Edit: Was ich tun möchte, ist ein git-Unterbefehl Befehl, der so funktioniert: Wenn ich git subdirs COMMAND ARGS tippe, möchte ich etwas wie for dir in */; do cd $dir && git COMMAND ARGS && cd ..; done (nur mit zusätzlicher Fehlerprüfung) tun. Außer, wenn git COMMAND ARGS den Repo in irgendeiner Weise modifizieren würde, möchte ich es nicht tun, weil es äußerst unwahrscheinlich ist, dass ich dieselbe Änderung an vielen verschiedenen Repos vornehmen möchte.

+0

Möchten Sie holen verhindern wollen? Ich kann sehen, dass dies ein sehr verbreiteter Anwendungsfall für ein Skript wie dieses ist, und Sie können sich vorstellen, dass es das Repo nicht modifiziert, aber das tut es definitiv. – Cascabel

+0

Nun, ich könnte immer noch eine Whitelist für Befehle wie fetch oder push implementieren, die nicht-destruktiv ändern, aber es wäre schön, mit einer Basisimplementierung zu beginnen, die nicht die Kapazität hat, 10 Repos versehentlich mit einem einzigen falsch eingegebenen Befehl zu brechen. –

+0

Tatsächlich kann Push mit '-f' destruktiv sein, also ist es wie in deinem' git branch' Beispiel. – MatrixFrog

Antwort

0

I implementiert dies mit unionfs-fuse. Dies ist komplett nicht portabel, aber es funktioniert für mich auf Ubuntu. Probieren Sie es mit git subdirs status in dem Verzeichnis aus, das all Ihre Git-Repos enthält.

Sie können es von Github erhalten: https://github.com/DarwinAwardWinner/git-custom-commands

0

Vielleicht können Sie tatsächlich eine Whitelist von Befehlen verwenden. Z.B. anstelle von git-status benutze git-diff-files und git-branch kannst du git-show-ref oder git-for-each-ref verwenden. Stellen Sie sicher, dass Sie die Low-Level (Plumbing) -Befehle auschecken. Wahrscheinlich finden Sie einen einfachen fokussierten Low-Level-Befehl für alle Ihre Skriptanforderungen.

+0

Das Gefühl über Klempner Befehle ist eine gute, aber manchmal ist es auch schön, einige der Porzellane zu haben. Ich denke, eine Whitelist könnte ziemlich langweilig werden, aber je nach Anwendungsfall könnte es sich lohnen. – Cascabel

1

Warum nicht Schreibzugriff auf das Repository-Verzeichnis verweigern?

$ chmod -R -w repo.git 
+2

Das Problem hier ist, dass die Repos normalerweise beschreibbar sein sollten, nur nicht für die Zwecke dieses Skripts. Diese Operation wäre auch sehr schwer umkehrbar - einige Inhalte eines Repositories sind aus Sicherheitsgründen immer schreibgeschützt, so dass Sie "chmod -R + w" nicht machen können, um es rückgängig zu machen. – Cascabel

+0

Vielen Dank für Ihre Kommentare. Das ist genau das Problem mit dieser Lösung. –

+0

Auf der anderen Seite könnte ich unionfs-fuse verwenden, um eine schreibgeschützte Ansicht meiner Repos zu machen. –

4

Es ist ein wenig kludgy, aber man konnte einfach Ihr Skript als Benutzer ausführen, keine Schreibrechte auf das Repository hat. Um nicht ein Passwort eingeben zu müssen, können Sie ein ssh-Schlüsselpaar und ssh als Ihren Benutzer in Ihren eigenen Rechner einbinden. (oder vielleicht über sudoers konfigurieren?)

Im Gegensatz zu einer Whitelist ist dies garantiert keine zufälligen Löcher oder übereifrige Einschränkungen. Es erfordert nicht, die Berechtigungen des Repo tatsächlich zu ändern, nur die Berechtigungen des Benutzers, der auf es einwirkt. Und es braucht kein extra Setup wie git-daemon.

(ich glaube, ich sollte beachten, dass es keine eingebauten „read-only“ Option git zu übergeben. Es ist einfach versucht, Dinge zu tun, und wenn sie die Genehmigung zu, tut sie.)

+0

Wirklich, ein -1? Es mag nicht ideal sein, aber das * funktioniert *. – Cascabel

+0

+1 Das ist das erste, woran ich gedacht habe, bevor ich eine der Antworten gelesen habe, und ich denke, es ist die einfachste und risikoärmste Methode. Die Fuse-Lösung ist interessant, wirkt aber wie Overkill. – Kelvin