Ich gewöhne mich endlich an Git und, nach der anfänglichen steilen Lernkurve, muss ich sagen, dass es ziemlich gut ist (ich vermisse nur die einzelnen Dateiexternen, aber das ist eine andere Geschichte). Ich habe jedoch ein Problem, das ich nicht lösen kann: Ich arbeite gerade an einem Dutzend Projekten gleichzeitig. Sie sind alle miteinander verbunden, und ich muss von einem zum anderen springen und hier und da Änderungen vornehmen.
Alles gut bis jetzt, ich kann sie ganz einfach "jonglieren", ich übergebe regelmäßig Änderungen und so weiter. Das Problem ist, dass ich nach mehreren Stunden nicht mehr weiß, welche Projekte ich an das Remote-Repository gesendet habe. Natürlich kann ich in jedes Projektverzeichnis "cd" und den Push-Befehl ausgeben, aber es ist mühsam. Ich habe mich gefragt, ob es einen Weg geben würde, bash zu benutzen, um etwas wie ein git find all unpushed commits in all projects in this directory
zu betreiben. Ein solcher Befehl würde von einem Verzeichnis ausgeführt, das nicht ein Git-Repository ist, aber einen Baum aller Projekte enthält.
Die Logik ist einfach, aber die Implementierung scheint ziemlich kompliziert zu sein, auch weil, obwohl das Wurzelverzeichnis alle Projekte enthält, die tatsächlichen Git-Repositories auf jeder Ebene des Startverzeichnisses gefunden werden können. Zum Beispiel:
In diesem Beispiel sind nur fett gedruckte Verzeichnisse Git-Repositories, daher sollte die Prüfung in ihnen ausgeführt werden. Ich bin mir bewusst, dass die Struktur ein wenig unordentlich aussieht, aber es ist eigentlich ziemlich einfach zu handhaben.
Jede Hilfe ist willkommen, danke.
Sie können ungespeicherte Commits mit git cherry
finden, also sollten Sie in der Lage sein, ein Bash-Skript wie
das wird 3 Ebenen von Unterverzeichnissen finden, aber es ist wahrscheinlich nicht sehr schön, es anzuschauen.
Wie Evan vorschlägt, können Sie eine Subshell verwenden, um cd
-ing ein Verzeichnis wie zB
Vielleicht möchten Sie hier einen pwd
-Befehl eingeben, um zu sehen, in welcher Datei / welchem Verzeichnis Sie sich befinden ...
Machen Sie die oberste Ebene zu einem Git Repo und machen Sie jedes Projekt zu einem Submodul. Jetzt können Sie
ausführen %Vor%recursive wird nicht benötigt, wenn Sie in Ihren Projekten keine Submodule haben.
Man könnte git Submodule betrachten, aber persönlich finde ich sie nicht angenehm, mit denen man arbeiten kann. Vor einiger Zeit habe ich also ein Skript erstellt, um an einer Sammlung von Git-Repos zu arbeiten: Ссылка
Mit clustergit
können Sie Git-Befehle gleichzeitig auf mehreren Repositorys ausführen. Es ist besonders nützlich, den git-Status rekursiv in einem Ordner auszuführen. clustergit
unterstützt git status
, git pull
, git push
und mehr.
Fügen Sie diesen Alias Ihrer .gitconfig
-Datei hinzu und dann können Sie git status-all
von einem übergeordneten Verzeichnis ausführen, um den Status aller Git-Repositories rekursiv abzurufen.
Siehe auch diesen Beitrag .
Sie können den folgenden One-Liner verwenden, mit dem Sie aus einem Verzeichnis, das kein Git-Repository ist, nach Ihren Anforderungen suchen können. Dadurch werden die absoluten Pfade zu den Git-Repositories aufgelistet, die Commits rückgängig gemacht haben:
%Vor%Dies funktioniert, indem rekursiv nach .git-Verzeichnissen gesucht wird, und wenn cd im übergeordneten Verzeichnis gefunden wird, welches der git-Projektstamm ist. Führen Sie dann git status und grep für die Phrase "is after of" aus. Wenn dies der Fall ist, wird der Befehl nach & amp; & amp; wird ausgeführt, in diesem Fall der Befehl 'pwd'. Hier können Sie eigene Befehle einfügen (z. B. um die nicht gedrückten Commits anzuzeigen).
Hinweis: funktioniert nur für ungespeicherte Commits auf dem aktiven Zweig
Die folgenden Befehle unterstützen auch Pfade mit Leerzeichen und drucken nur Verzeichnisse mit einem .git
-Unterverzeichnis in ihnen.
Anzahl der nicht gedrückten Änderungen pro Repo (für alle Zweige):
%Vor%Anzahl nicht festgeschriebener Dateien pro Repo (gestaffelt und nicht im Stapel):
%Vor% Hinweis git cherry
funktioniert nicht, wenn upstream (-u) nicht festgelegt wurde, während git log
dies tut.