Pflegen Sie das Git-Repo in einem anderen Git-Repo

124

Folgendes möchte ich:

REPO-A
  /.git
  /otherFiles
  /REPO-B
    /.git
    /moreFiles

Ich möchte in der Lage sein, den gesamten Inhalt von REPO-A auf REMOTE-A und nur REPO-B auf REMOTE-B zu übertragen.

Möglich?

Adamyonk
quelle

Antworten:

104

Es hört sich so an, als ob Sie Git- Submodule verwenden möchten .

Git behebt dieses Problem mithilfe von Submodulen. Mit Submodulen können Sie ein Git-Repository als Unterverzeichnis eines anderen Git-Repositorys behalten. Auf diese Weise können Sie ein anderes Repository in Ihr Projekt klonen und Ihre Commits getrennt halten.

Mipadi
quelle
19
Nicht genau: Es wird nicht den gesamten Inhalt von repoA verschieben: nur A plus einen Verweis auf B. Aber ich kritisiere Ihre Antwort nicht, ich habe mich beeilt, ziemlich gleich zu schreiben, als ich die Frage des OP erneut gelesen habe;)
VonC
1
Dies ist so ziemlich der Anwendungsfall für Submodule. REPO-A und REPO-B werden als eigenständige Git-Repos behandelt, mit ihren eigenen Verpflichtungen, Ursprüngen, ihrer eigenen Geschichte usw.
Damien Wilson,
2
Wenn ich das richtig lese, kann ich dann ein Submodul-d-Repo unabhängig von dem überprüfen, in dem ich es finde? Wie würde ich ein bereits vorhandenes Repo nehmen und es in einem anderen Projekt als Submodul referenzieren?
JohnO
Ich habe nicht nach genau der gleichen Lösung wie OP gesucht, und ich denke, dass dies im Durchschnitt wahrscheinlich eine eher gesuchte Antwort auf eine ähnliche Frage ist: "Wird durch das Platzieren von Git REPO-B in Git REPO-A eine Referenz oder eine vollständige Kopie eingebettet? von git REPO-B? ".
Jaya
64

Ich habe immer Symlinks verwendet, um zwei separate und unterschiedliche Repos zu verwalten.

JohnO
quelle
8
Für wie verwirrend Git-Submodule und Git-Subbaum erscheinen, ist dies eine gültige Antwort.
Trevor Hickey
Dies ist auch sehr nützlich, um eine Anwendung aus mehreren Remote-Repositorys zusammenzustellen
GeraldScott
22
Wäre es nicht in Ordnung, Repo B in Repo A zu belassen und Repo B lediglich zu Repo A hinzuzufügen, um zwei separate und unterschiedliche Repos beizubehalten .gitignore?
Fabien Snauwaert
1
Ich habe darüber nachgedacht, das zu tun, was Fabien vorschlägt. Gibt es ein Problem damit?
theonlygusti
1
Ich halte die Git-Repositorys getrennt und kopiere Änderungen, die an REPO-B vorgenommen wurden, in eine Kopie von REPO-B (ohne .git), die in REPO-A verschachtelt ist. Ich mache das mit rsync. Ich laufe, rsync -avh --delete --exclude='.git' REPO-B/ REPO-A/REPO-B-copy/nachdem es irgendwelche Änderungen an REPO-B
Shai
29

Ja, Sie können mit der von Ihnen gezeichneten Dateihierarchie genau das tun, was Sie verlangen. Repo-B ist unabhängig und hat keine Kenntnisse über Repo-A. Repo-A verfolgt alle Änderungen in seinen eigenen Dateien und in den Dateien von Repo-B.

Ich würde dies jedoch nicht empfehlen. Jedes Mal, wenn Sie Dateien ändern und in Repo-B festschreiben, müssen Sie in Repo-A festschreiben. Das Verzweigen in Repo-B führt zu Problemen mit Repo-A, und das Verzweigen in Repo-A ist schwierig (Probleme beim Entfernen von Ordnern usw.). Submodule sind definitiv der richtige Weg.

kubi
quelle
53
Können Sie REPO-B nicht einfach zu /REPO-A/.gitignore hinzufügen?
Mikkelbreum
2
@mikkelbreum Ich hatte genau die gleiche Idee. Wir verwenden derzeit Subverion für unser Hauptprojekt und verwenden ein Git-Repo in einem der Unterordner. Mit SVN habe ich gerade den Ordner mit dem Git-Repo zur Eigenschaft svn: ignore hinzugefügt und mich gefragt, ob ich dasselbe mit git machen kann.
2ndkauboy
3
Nun, ich kann nicht verstehen, warum das Hinzufügen eines verschachtelten Git-Repos zur Ignorierliste des übergeordneten Repos nicht funktionieren sollte. Gleichzeitig habe ich das Gefühl, dass es einen Haken geben muss, an den ich nicht gedacht habe, da dieser Ansatz so ist selten gesehen vorgeschlagen, und viele Leute entmutigen verschachtelte Git-Repos.
Mikkelbreum
18
Ich habe gerade genau dieses Szenario implementiert. Ich habe einige unkomprimierte CSS-Dateien in einem Unterordner, die nicht in das Remote-Repo verschoben werden sollen. Sie befinden sich also in meinem Gitignore. Ich möchte jedoch Änderungen an diesen Dateien lokal verfolgen. Ich habe ein Repo im Ordner mit den unkomprimierten Dateien eingerichtet und alle Dateien zu diesem Repo hinzugefügt. Es wird vom übergeordneten Repo immer noch ignoriert, aber ich kann Änderungen innerhalb des Sub-Repos verfolgen. Empfohlen oder nicht, diese Lösung ist der Schlüssel für bestimmte Situationen wie diese.
BrianVPS
1
Ich verstehe, dass jedes Mal, wenn Sie die Zweige in einem Repository wechseln, das andere eine ganze Reihe von Änderungen sieht, aber warum wird "das Verzweigen in Repo-A wackelig (Probleme beim Entfernen von Ordnern usw.)"? Vielen Dank!
user2688151
2

Sie können erreichen, was Sie wollen (dieses REPO-A-Repo enthält alle Dateien, einschließlich der Dateien im Ordner REPO-B anstelle nur einer Referenz), indem Sie "git-subrepo" verwenden:

https://github.com/ingydotnet/git-subrepo

Es funktioniert immer noch, wenn einige Ihrer Mitwirkenden den Befehl subrepo nicht installiert haben. Sie sehen die vollständige Ordnerstruktur, können jedoch keine Änderungen an den Unterrepos vornehmen.

Kleben
quelle