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

Benutzer-Avatar
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:

### wishful thinking

git submodules init --all
git submodules add --all

🙁

Benutzer-Avatar
Mussa Karl

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

1017960cookie-checkAlle Submodule automatisch zu einem Repo hinzufügen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy