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?
Wie füge ich bereits geklonte Projekte als Submodule hinzu?
Neevek
Das Hinzufügen eines bestehenden Git-Repositorys als Submodul ist dasselbe wie das Hinzufügen eines neuen.
- Machen Sie zuerst den Ordner, der alle Ihre Git-Repositories enthält, selbst zu einem Git-Repository mit
git init
. - Verwenden
git submodule add https//example.com/remoterepo ./localrepo
Wo./localrepo
ist Ihr vorhandenes Git-Repository.- Hinweis: Sie erhalten die URL für
remoterepo
auslocalrepo/.git/config
.
- Hinweis: Sie erhalten die URL für
- Wiederholen Sie den zweiten Schritt für alle Ihre vorhandenen Repositories, die Sie als Submodule hinzufügen möchten.
- 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_A
es 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
Undpopd
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 seinfor 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:
-
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
-
Verwenden
git submodule add https//example.com/remoterepo ./localrepo
Wo./localrepo
ist Ihr vorhandenes Git-Repository.- Hinweis: Sie erhalten die URL für
remoterepo
auslocalrepo/.git/config
.
- Hinweis: Sie erhalten die URL für
- Wiederholen Sie den zweiten Schritt für alle Ihre vorhandenen Repositories, die Sie als Submodule hinzufügen möchten.
- 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