Alle Submodule automatisch zu einem Repo hinzufügen
Lesezeit: 4 Minuten
Ich habe ein großes Verzeichnis ~/.vim und darin habe ich ein Unterverzeichnis mit vielen anderen Git-Repos darin. Ich möchte ein Git-Repo von meiner erstellen ~/.vim -Verzeichnis, aber ich möchte nicht jedes meiner anderen Git-Unterverzeichnisse durchgehen.
Gibt es eine Möglichkeit, alle Submodule rekursiv durchzugehen und hinzuzufügen?
Sie möchten Ihren .vim-Ordner zu einem Git-Repo machen und alle Ihre Unterverzeichnisse (die Git-Repos sind) als Untermodule hinzufügen? Ist das richtig ?
– Fatih Arslan
15. Mai 2012 um 18:19 Uhr
ja, ich habe ~/.vim/bundle/matchit zum Beispiel, das direkt von github geklont wird
– Mazlix
15. Mai 2012 um 18:41 Uhr
Fatih Arslan
Vermuten diese .vim ist bereits ein gültiges Git-Repo und Sie möchten alle Git-Repos zu Ihrem Haupt-Git-Repo hinzufügen, dann ist die folgende for-Schleife wahrscheinlich das, was Sie brauchen:
Zuerst, cd zur Wurzel von dein Git-Repository.
Einfügbarer Vorschaubefehl – nur Echo, nimmt keine Änderungen vor:
for x in $(find . -type d) ; do if [ -d "${x}/.git" ] ; then cd "${x}" ; origin="$(git config --get remote.origin.url)" ; cd - 1>/dev/null; echo git submodule add "${origin}" "${x}" ; fi ; done
Einfügbarer Befehl zum Hinzufügen der Submodule:
for x in $(find . -type d) ; do if [ -d "${x}/.git" ] ; then cd "${x}" ; origin="$(git config --get remote.origin.url)" ; cd - 1>/dev/null; git submodule add "${origin}" "${x}" ; fi ; done
Diese Schleife findet zuerst nur Verzeichnisse, sucht nach einem .git-Verzeichnis, identifiziert die ursprüngliche URL und fügt dann das Submodul hinzu.
Lesbare Version:
for x in $(find . -type d) ; do
if [ -d "${x}/.git" ] ; then
cd "${x}"
origin="$(git config --get remote.origin.url)"
cd - 1>/dev/null
git submodule add "${origin}" "${x}"
fi
done
Folgendes hat bei mir funktioniert: for i in $(ls -d bundle/*); do;if [ -d "$i"/.git ]; then; git submodule add $(cd $i && git remote show origin | grep Fetch | awk '{print $3}') ./$i; fi; done
– NeonNinja
16. August 2013 um 7:27 Uhr
Ändern Sie die anfängliche for-Schleife find Befehl zu for x in $(find . -mindepth 1 -maxdepth 1 -type d)das -mindepth wird benötigt, um das aktuelle Verzeichnis der obersten Ebene (das ‘.’) zu überspringen, während maxdepth erlaubt nicht find um tiefer in die Dir-Struktur einzusteigen. Vielleicht möchten Sie die überspringen -maxdepth wenn Sie tief verschachtelte Repos haben.
– Dmitri Avtonomov
26. November 2018 um 1:17 Uhr
cd /to/super/repo
root_path=$(pwd)
for submodule in $(find -mindepth 2 -type d -name .git); do
submodule_dir=$root_path/$submodule/..
remote_name=$(cd $submodule_dir && git rev-parse --abbrev-ref --symbolic-full-name @{u}|cut -d"https://stackoverflow.com/" -f1 )
remote_uri=$(cd $submodule_dir && git remote get-url $remote_name)
echo "Adding $submodule with remote $remote_name..."
# If already added to index, but not to .gitmodules...
git rm --cached $submodule_dir &> /dev/null
git submodule add $remote_uri $submodule_dir
done
Ich hatte Git-Repos in tieferen Unterverzeichnissen verschachtelt, um sie also aus jeder Tiefe zu finden und hinzuzufügen, musste ich Folgendes verwenden:
for i in $(find ~/Sources/* -type d -name .git)
do
cd $i && cd .. && git submodule add $(pwd)
done
Ich bezweifle, dass dies etwas Nützliches bringt. Dadurch werden die Submodule mit einem lokalen Pfad als remote hinzugefügt, jedoch mit einem http- oder ssh-URI.
– lumbrisch
14. Dezember 2017 um 23:59 Uhr
leider scheint diese Funktion nicht zu existieren. git sollte einen Befehl haben, der alle Module hinzufügen kann, auf die in .gitmodules verwiesen wird, etwa so:
Da dies in vielen Projekten eine sich wiederholende Aufgabe sein kann, habe ich zwei Hilfsfunktionen basierend auf großartigen @Fatih-Antworten mit wenigen Änderungen erstellt und sie mit einer benutzerdefinierten Bash-Shell-Datei auf meinem Computer gespeichert.
Diese Funktionen können in jedem Ordner aufgerufen werden, ohne dass Sie sich alle Implementierungsdetails merken oder eingeben müssen.
Hier sind die Schritte, um das Leben einfacher zu machen:
Erstellen Sie in Ihrem Benutzerstammpfad eine Datei in der Art
.myBashCommands.sh
Schreiben Sie den folgenden Inhalt hinein. Wenn Sie bereits eine eigene dedizierte Datei für benutzerdefinierte Funktionen haben, können Sie diese stattdessen verwenden.
#!/bin/bash
# Find and log all git sub-modules if exist without making any changes.
# Credits: https://stackoverflow.com/a/10607225/7551807
function logAllGitSubModulesIfExist() {
for x in $(find . -type d) ; do
if [ -d "${x}/.git" ] ; then
cd "${x}" ;
origin="$(git config --get remote.origin.url)" ;
cd - 1>/dev/null;
echo "found gitsubmodule at =>" "${origin}" "${x}" "\n";
fi ;
done
}
# This loop first finds directories only, looks for a .git directory, identifies the original URL and then adds the submodule.
# Credits: https://stackoverflow.com/a/10607225/7551807
function addAllGitSubModules() {
for x in $(find . -type d) ; do
if [ -d "${x}/.git" ] ; then
cd "${x}"
origin="$(git config --get remote.origin.url)"
cd - 1>/dev/null
git submodule add "${origin}" "${x}"
fi
done
}
Schließen Sie die Datei und aktualisieren Sie Ihr Terminal, während Sie sich noch im selben Arbeitsverzeichnis befinden, damit es Ihre neu hinzugefügten Methoden erkennt.
So geht’s: –
source .myBashCommands.sh
Das ist es! Jetzt können Sie die beiden Funktionen in jedem Projekt und in jedem Ordner wiederverwenden.
Um die Methoden aufzurufen, geben Sie einfach den Namen ein.
Um beispielsweise alle verfügbaren Submodule zu protokollieren, geben Sie einfach Folgendes in Ihr Terminal ein
logAllGitSubModulesIfExist
Um alle vorhandenen Submodule zu finden und hinzuzufügen, geben Sie einfach Folgendes ein: –
addAllGitSubModules
10179600cookie-checkAlle Submodule automatisch zu einem Repo hinzufügenyes
Sie möchten Ihren .vim-Ordner zu einem Git-Repo machen und alle Ihre Unterverzeichnisse (die Git-Repos sind) als Untermodule hinzufügen? Ist das richtig ?
– Fatih Arslan
15. Mai 2012 um 18:19 Uhr
ja, ich habe
~/.vim/bundle/matchit
zum Beispiel, das direkt von github geklont wird– Mazlix
15. Mai 2012 um 18:41 Uhr