Wie füge ich bereits geklonte Projekte als Submodule hinzu?

Lesezeit: 6 Minuten

Ich habe in einem Ordner eine große Anzahl von Projekten, die ich seit geraumer Zeit geklont habe; vor kurzem habe ich diesen ganzen Ordner in eines meiner Repos verschoben und möchte diese geklonten Projekte in Untermodule umwandeln, damit ich sie in Zukunft besser aktualisieren und kontrollieren kann. Ich habe viel gegoogelt, wie das geht, aber alle Tutorials sprechen nur darüber, wie man neue Submodule hinzufügt. Wer kann mir helfen?

neeveks Benutzeravatar
Neevek

Das Hinzufügen eines bestehenden Git-Repositorys als Submodul ist dasselbe wie das Hinzufügen eines neuen.

  1. Machen Sie zuerst den Ordner, der alle Ihre Git-Repositories enthält, selbst zu einem Git-Repository mit git init.
  2. Verwenden git submodule add https//example.com/remoterepo ./localrepoWo ./localrepo ist Ihr vorhandenes Git-Repository.
    • Hinweis: Sie erhalten die URL für remoterepo aus localrepo/.git/config.
  3. Wiederholen Sie den zweiten Schritt für alle Ihre vorhandenen Repositories, die Sie als Submodule hinzufügen möchten.
  4. Jetzt können Sie laufen git submodule foreach git pull um alle Ihre Teilprojekte zu aktualisieren.

Vielleicht möchten Sie ein kleines Skript schreiben, um den zweiten Schritt zu automatisieren, wenn Sie viele Submodule haben, was nicht schwierig sein sollte.

Bearbeiten

Folgendes habe ich verwendet, um den in den Kommentaren erwähnten Fehler zu reproduzieren. Ich habe die Befehle dreifach überprüft, und ich still kann den fehler nicht sehen:

git --version

mkdir submoduletest
cd submoduletest

git init --bare remote_repo_A
git init --bare remote_repo_B 

git clone remote_repo_A local_repo_A
git clone remote_repo_B local_repo_B

cd local_repo_A
echo "test commit on repo B" >> test.txt
git add test.txt
git commit -m 'test commit message'
git push origin master

cd ../local_repo_B
echo "test commit on repo B" >> test.txt
git add test.txt
git commit -m 'test commit message'
git push origin master

cd ../local_repo_A
git clone ../remote_repo_B local_repo_B
git submodule add ../remote_repo_B ./local_repo_B
git submodule foreach git pull origin master

git add .
git ci -m 'we just added a submodule for remote_repo_B'

git submodule status

Verwenden Sie den folgenden Befehl, um den aktuellen Status von zu überprüfen local_repo_Aes hat nur zwei Blob-Objekte, eines für ‘test.txt’ und ein anderes für die implizit erstellte ‘.gitmodules’-Datei, nichts von remote_repo_B kommen hinzu Index von local_repo_A.

find .git/objects -type f | awk -F/ '{print $3$4}' | xargs -I {} git cat-file -t {} | grep blob

Der Grund, warum ich die Bearbeitungen rückgängig gemacht habe, ist, dass die Bearbeitungen einfach FALSCH sind, das war es bereits von zwei anderen Mediatoren abgelehnt und ich, aber später hat ein anderer Typ es genehmigt, ich bin mir nicht sicher, ob es ein Fehler von SO ist oder was. Aber die Bearbeitungen werden abgelehnt, sogar jetzt, weil es völlig falsch ist, Warum habe ich bereits in den Kommentaren erklärtIch bin für niemanden beleidigend, aber das hat meine Zeit verschwendet. Stimmen Sie es ab, wenn die Antwort für Sie nicht hilfreich ist.

Nochmals, wenn Sie es nicht verbessern, bearbeiten Sie meine Antwort NICHT.

  • Es sieht nach der richtigen Lösung aus. Ich war letzte Nacht in Eile und habe beschlossen, am Ende alle Repositories zu entfernen und neu hinzuzufügen. Aber trotzdem danke für deine Antwort! Obwohl ich mich frage, ob es überhaupt so ist, dass Sie die URL nicht eingeben müssen (die Remote-URL sollte irgendwo in einem vorhandenen Repo vorhanden sein, haben Sie nur keine Ahnung, wie Sie das extrahieren sollen.)

    – L__

    24. Mai 2013 um 13:48 Uhr

  • Ich erhalte die Fehlermeldung “ist bereits im Index vorhanden”. @lynnard Hast du die Antwort getestet, bevor du sie überprüft hast? Wenn nicht, dann fordere ich Sie auf, dies zu tun, da dies irreführend ist

    – MuhsinFatih

    28. Januar 2018 um 22:50 Uhr

  • @lynnard Ich habe das Problem tatsächlich umgangen und eine Bearbeitung vorgeschlagen. Beifall!

    – MuhsinFatih

    28. Januar 2018 um 23:11 Uhr

  • @MuhsinFatih, Sie erhalten den Fehler “bereits im Index vorhanden”, weil Sie die Anweisungen nicht so befolgt haben. Sie müssen die Sub-Repos als normale Verzeichnisse zum Master-Repo hinzugefügt haben, bevor Sie sie als Submodule hinzufügen. In diesem Fall werden sie nicht als Submodule behandelt werden. Übrigens wird die Bearbeitung abgelehnt, da dies nicht Teil der Antwort ist, sondern etwas, über das man lernen sollte submodule Befehl oder Git im Allgemeinen.

    – Neevek

    29. Januar 2018 um 7:58 Uhr

  • @neevek Aber das hat das OP nicht verlangt. Er sagte, er habe bereits ein Git-Repository, das die anderen Git-Repositorys enthält, die erneut schwer herunterzuladen sein werden. Außerdem, da ich für Schritt 2 “bereits geklontes Repository” gesagt habe, kann eine Person, wenn sie keine hat, den Schritt einfach überspringen. Darüber hinaus ist Ihre Aussage: “Das Hinzufügen eines vorhandenen Git-Repositorys als Submodul ist dasselbe wie das Hinzufügen eines neuen” falsch und widerspricht Ihrem Kommentar. Möchten Sie „vorhandene Git-Repositories“ als Untermodule zum Repository hinzufügen oder möchten Sie „neue Get-Repositories“ als Untermodule hinzufügen?

    – MuhsinFatih

    29. Januar 2018 um 8:07 Uhr


Um viele Submodule hinzuzufügen, habe ich diese einfache Schleife geschrieben:

for repo in vim/bundle/*
do
  echo $repo
  pushd $repo
  url=$(git remote get-url $(git remote))
  echo $url
  popd
  git submodule add $url ./$repo
done

Offensichtliche Einschränkungen, die ich nicht behoben habe:

  • Sie müssen das Verzeichnis nicht ändern, ziemlich sicher, dass Sie das Git-Verzeichnis als Argument an Befehle übergeben können
  • git remote gibt tatsächlich alle Fernbedienungen zurück, nicht nur die aktuelle, so dass das Skript bricht, wenn es mehrere gibt

  • Zur ersten Einschränkung: pushd Und popd sollte durch die ersetzbar sein -C <path> Option von git, dh, git -C $repo submodule add $url ./$repo. Die zweite Einschränkung sollte mit lösbar sein for remote in $(git remote); do ...; done Wo ... ist die Deklaration der URL-Variablen, das Echo und das Submodul hinzufügen. Aber da ich es (noch) nicht getestet habe, werde ich die Antwort dafür nicht bearbeiten.

    – Valentin Kühn

    8. September 2022 um 7:54 Uhr

Ich werde die Antwort von @neevek ergänzen, wenn Sie die erhalten already exists in the index Fehler, dann können Sie diese Version versuchen:

  1. Entfernen Sie jedes „bereits geklonte Repository“ aus Zwischenspeicher:
    (Da dort bereits ein Objekt vorhanden ist, das nicht auf das Repository als Submodul verweist, und es zuerst aus dem Index gelöscht werden muss, um Konflikte zu vermeiden. Der Inhalt oder Index Ihrer Repositorys wird nicht dabei gelöscht werden)

    git rm --cached ./localrepo
    
  2. Verwenden git submodule add https//example.com/remoterepo ./localrepoWo ./localrepo ist Ihr vorhandenes Git-Repository.

    • Hinweis: Sie erhalten die URL für remoterepo aus localrepo/.git/config.
  3. Wiederholen Sie den zweiten Schritt für alle Ihre vorhandenen Repositories, die Sie als Submodule hinzufügen möchten.
  4. Jetzt können Sie laufen git submodule foreach git pull um alle Ihre Teilprojekte zu aktualisieren.

Wenn Sie viele Submodule haben, möchten Sie vielleicht ein kleines Skript schreiben, um den zweiten Schritt zu automatisieren.

  • git rm --cached ./localrepo Das hat mir bei anderen Antworten gefehlt. Sonst habe ich '<rep>' already exists in the index

    – synther

    23. Dezember 2019 um 17:00 Uhr

1445840cookie-checkWie füge ich bereits geklonte Projekte als Submodule hinzu?

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

Privacy policy