Ich habe ein großes Projekt (sagen wir A repo
), und es gibt dort einen untergeordneten Ordner, der von B repo
stammt. Ich würde folgende Warnung treffen, wenn ich mich von A repo
begebe
warning: adding embedded git repository: extractor/annotator-server
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint:
hint: git submodule add <url> extractor/annotator-server
hint:
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint:
hint: git rm --cached extractor/annotator-server
hint:
hint: See "git help submodule" for more information.
Ich habe git-submodule
und git-subtree
gesehen:
Git-Repo in einem anderen Git-Repo beibehalten
https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree
Aber ich mag sie nicht, weil sie eine zusätzliche Konfiguration benötigen.
Was ich will, ist zum Beispiel:
struktur wie:
A/
--- a.py
--- B/
--- B/b.py
Wenn ich B/b.py
ändere.
Wenn ich mich auf Pfad A/
befinde, kann git add
B/b.py
geändert feststellen, git Push
schreibt nur das A-Repo fest.
git add . (would add changes under A/ )
git Push (would Push changes under A/ )
git pull (would pull changes under A/ )
git clone XXX:A (would clone all files under A/ , A/B/ is just looks like plain folder with all files, not a repo )
Wenn ich mich im Pfad A/B/
befinde, füge git add
nur B/b.py
-Änderungen zu B-Repo hinzu, und git Push
schreibt nur das zu B-Repo.
git add . (would add changes under B/ , but not add changes to A repo)
git Push (would Push changes under B/ , but not Push changes to A repo)
git pull (would clone changes under B/ , )
git clone XXX:B (would clone all files under B/ )
Wenn ich A und B auf einem anderen Rechner snycieren möchte, tun Sie dies einfach
git clone A
rm -rf A/B/
git clone B ./B
git add . && git commit 'sync with B'
In einem anderen Wort fungieren A und B als eigenständiges Repo.
Aber die Wahrheit ist, A Repo behandelt B Repo als Submodul:
Ein Repo https://github.com/eromoe/test
B repo https://github.com/eromoe/test2
Wie erzwinge ich, dass A-Repo alle Dateien unter A/
und B-Repo alle Dateien unter A/B/
verfolgt? Ich möchte, dass A und B als eigenständige Repos fungieren, ohne dass eine andere Konfiguration erforderlich ist.
Mit den folgenden Befehlen können Sie Dateien aus test2 repo zu test repo hinzufügen:
# In local test repo
rm -rf test2
git clone https://github.com/eromoe/test2
git add test2/
git commit -am 'add files from test2 repo to test repo'
git Push
Hinweis:
Sie solltengit add test2/
verwenden (mit Schrägstrich, nicht git add test2
).
git add test2/
behandelt den test2
-Ordner und seine Dateien als normale Ordner und Dateien für das Testrepo (Erstellungsmodus 100644
).
git add test2
behandelt den test2
-Ordner als Submodul für Test-Repo (Erstellungsmodus 160000
).
Wahrscheinlich erinnerte git an das Repository. Es hat mir geholfen:
git rm --cached your_folder_with_repo git commit -m "Gelöstes Repo entfernen" git addiere deinen_Ordner_mit_repo / git commit -m "Ordner hinzufügen" git Push
Wenn Sie sich nicht für die genaue Version von B A interessieren, können Sie Ihre aktuelle Einstellung (verschachtelte Git-Repos) beibehalten.
Sie werden die Warnung "Embedded Repo" erhalten, aber nebenbei verhalten sich beide Repos wie erwartet, wobei jedes Repository nur ihre Repos hinzufügt, bindet und pusht.
Hinweis: Sie können diese Warnung mit git config advice.addEmbeddedRepo
kurzschließen/leeren.