Maintenir git repo dans un autre git repo

125

Voici ce que j'aimerais:

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

Je veux pouvoir pousser tout le contenu de REPO-A vers REMOTE-A et seulement REPO-B vers REMOTE-B.

Possible?

Adamyonk
la source

Réponses:

104

Il semble que vous souhaitiez utiliser des sous-modules Git .

Git résout ce problème à l'aide de sous-modules. Les sous-modules vous permettent de conserver un référentiel Git en tant que sous-répertoire d'un autre référentiel Git. Cela vous permet de cloner un autre référentiel dans votre projet et de séparer vos commits.

mipadi
la source
19
Pas exactement: cela ne poussera pas tout le contenu du repoA: seulement A plus une référence à B.Mais je ne critique pas votre réponse, je me précipitais pour écrire à peu près la même chose quand j'ai relu la question de l'OP;)
VonC
1
C'est à peu près le cas d'utilisation des sous-modules. REPO-A et REPO-B sont traités comme des dépôts git à part entière, avec leurs propres commits, origines, histoire, etc.
Damien Wilson
2
Donc, si je lis bien, puis-je vérifier indépendamment un dépôt de sous-module-d entièrement en dehors de celui dans lequel je le trouve? Comment puis-je prendre un référentiel déjà existant et le référencer en tant que sous-module dans un autre projet?
JohnO
Je ne cherchais pas exactement la même solution que OP, et je pense qu'en moyenne c'est probablement une réponse plus recherchée à une question similaire: "est-ce que placer git REPO-B dans git REPO-A intègre une référence ou une copie complète de git REPO-B? ".
jaya
64

J'ai toujours utilisé des liens symboliques pour maintenir deux dépôts séparés et distincts.

JohnO
la source
8
pour à quel point les sous-modules git et le sous-arbre git semblent confus, c'est une réponse valable.
Trevor Hickey
Ceci est également très utile pour assembler une application à partir de plusieurs référentiels distants
GeraldScott
22
Pour maintenir deux dépôts séparés et distincts, ne serait-il pas correct de garder le repo B dans le repo A et d'ajouter simplement le repo B aux repo A .gitignore?
Fabien Snauwaert
1
Je pensais faire ce que Fabien suggère, y a-t-il un problème à faire ainsi?
theonlygusti
1
Je garde les dépôts git séparés et je copie les modifications apportées à REPO-B dans une copie de REPO-B (sans .git) imbriquée dans REPO-A. Je fais ça avec rsync. Je cours rsync -avh --delete --exclude='.git' REPO-B/ REPO-A/REPO-B-copy/après qu'il y ait des changements à REPO-B
Shai
29

Oui, vous pouvez faire exactement ce que vous demandez avec la hiérarchie de fichiers que vous avez dessinée. Repo-B sera indépendant et n'aura aucune connaissance de Repo-A. Repo-A suivra toutes les modifications dans ses propres fichiers et les fichiers de Repo-B.

Cependant, je ne recommanderais pas de faire cela. Chaque fois que vous modifiez des fichiers et que vous vous engagez dans Repo-B, vous devrez vous engager dans Repo-A. Le branchement dans Repo-B perturbera Repo-A et le branchement dans Repo-A sera bancal (problème de suppression de dossiers, etc.). Les sous-modules sont définitivement la voie à suivre.

kubi
la source
53
Ne pouvez-vous pas simplement ajouter REPO-B à /REPO-A/.gitignore?
mikkelbreum
2
@mikkelbreum J'ai eu exactement la même idée. Nous utilisons actuellement subverion pour notre projet principal et utilisons un dépôt git dans l'un des sous-dossiers. Avec SVN, je viens d'ajouter le dossier avec le repo git à la propriété svn: ignore et je me demandais si je pouvais faire de même avec git.
2ndkauboy
3
Eh bien, je ne vois pas pourquoi l'ajout d'un repo git imbriqué à la liste des ignorés du repo parent ne devrait pas fonctionner. Mais en même temps, j'ai le sentiment qu'il doit y avoir un problème auquel je n'ai pas pensé, car cette approche est rarement vu suggéré, et beaucoup de gens découragent les dépôts git imbriqués.
mikkelbreum
18
Je viens de mettre en œuvre ce scénario exact. J'ai des fichiers CSS non compressés dans un sous-dossier que je ne veux pas pousser vers le repo distant, donc c'est dans mon .gitignore. Mais je souhaite suivre les modifications apportées à ces fichiers localement. J'ai mis en place un référentiel dans le dossier avec les fichiers non compressés et ajouté tous les fichiers à ce référentiel. Il est toujours ignoré par le dépôt parent, mais je peux suivre les modifications à l'intérieur du sous-dépôt. Recommandée ou non, cette solution est essentielle pour certaines situations comme celle-ci.
BrianVPS
1
Je comprends que chaque fois que vous changez de branche dans un référentiel, l'autre verra tout un tas de changements, mais pourquoi "la création de branches dans Repo-A sera-t-elle bancale (difficulté à supprimer des dossiers, etc.)"? THX!
user2688151
2

Vous pouvez obtenir ce que vous voulez (ce dépôt REPO-A contient tous les fichiers, y compris ceux du dossier REPO-B au lieu d'une seule référence) en utilisant "git-subrepo":

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

Cela fonctionne toujours si certains de vos contributeurs n'ont pas installé la commande subrepo; ils verront la structure complète des dossiers mais ne pourront pas valider les modifications des sous-dépôts.

La colle
la source