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?

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.


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.


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.