Ich schreibe ein Skript, um das Hinzufügen, Übernehmen und Übertragen von Änderungen an meinem Untermodul und meinem Repository zu automatisieren. Einige Untermodule sind weiter verschachtelt als andere, und ich muss per CD zurück zum Stamm des Repositorys wechseln. Ich verwende das git submodule foreach
Muster nicht, da es in anderen Untermodulen möglicherweise Änderungen gibt, die ich aus dem Zweig, an dem ich arbeite, nicht an sie übertragen möchte (ein kurzer Test). Ich habe für jedes Untermodul einen Zweig im Super-Repository eingerichtet, der praktischerweise so benannt ist, dass man per CD zum Repository zurückwechseln kann.
ich fanddiese Fragedas Antworten enthält, die sich auf das Erstellen und/oder Aliasing einer Funktion zum CD-Up auf n Ebenen beziehen. Ich könnte so etwas tun, da ich bereits einige Aliasing-Funktionen für andere Aktionen habe, aber es würde für jedes Verzeichnis eine andere Funktion oder ein anderes Skript erfordern, also einen anderen Hotkey in Git Extensions, das sich auf einer anderen Ebene befindet.
Ich verwende Git Extensions zur Verwaltung meines Repos und es bietet in seinen Einstellungen eine Skriptschnittstelle. Meine aktuelle Funktion unter dem Alias in der .git/config:
applyupdate = "!f() { \
cd \"$1\"/;\
git add .;\
git commit -m \"$2\";\
git push;\
cd ..;\ #####this needs to be n levels
git add \"$1\";\
git commit -m \"$2\";\
git push;\
}; f"
Dies wird in der Git-Erweiterung über einen Hotkey ausgeführt, der es mit den folgenden Argumenten ausführt:
applyupdate {cBrnach} {{UserInput}}
wo {cBranch}
wird der aktive Zweig sein, oder es wird nach einem Zweig gefragt, wenn mehrere auf demselben Commit im Diagramm liegen,
und {{UserInput}}
es wird ein Dialogfeld zum Einfügen einer zitierten Commit-Nachricht angezeigt.
Kann cd n-levels
dies mit einer einzigen Funktion und auf eine Weise erledigt werden, bei der ich nicht eingeben muss, wie viele Ebenen ich nach oben muss? Ich glaube nicht, dass die {UserInput}
Option in Git Extensions mit mehreren Eingaben funktioniert.
Antwort1
Dank anArkadiusz Drabczykfür die Erwähnung git rev-parse --show-toplevel
.
Das Ändern des Skripts wie folgt funktioniert bei mir:
applyupdate = "!f() { \
cd \"$1\"/;\
git add .;\
git commit -m \"$2\";\
git push;\
cd ..;\ #this gets me out of the submodule
cd \"$(git rev-parse --show-toplevel)\";\ #this return to super-repo's root
git add \"$1\";\
git commit -m \"$2\";\
git push;\
}; f"