Comment changer un sous-module git pour qu'il pointe vers un sous-dossier?

103

En parcourant le didacticiel SubModule , j'ai créé un sous-module à partir du projet boto . Ensuite, j'ai découvert que je n'avais en fait besoin que d'un sous-ensemble de ce projet - en particulier, le dossier boto .

Je voudrais changer mon sous-module pour qu'il pointe vers ce dossier. Quand je regarde dans .gitmodules, je vois

[submodule "backup/src/boto"]
    path = backup/src/boto
    url = https://github.com/boto/boto.git

Quelle URL dois-je utiliser au lieu de https://github.com/boto/boto.git ? Après avoir changé l'URL, dois-je supprimer le dossier boto localement et le retirer?

ripper234
la source
3
Ce n'est pas exactement ce que vous voulez - pas un sous-module - mais vous pourriez y jeter un coup d'œilgit subtree
Cascabel
1
Ce que j'ai fini par faire, c'est avoir le sous-module entier et dire à IntelliJ que le dossier boto est un «dossier source», afin qu'il puisse y trouver des paquets.
ripper234
15
Je ne peux pas croire que git ne le fasse pas nativement ... ouais.
rogerdpack
2
J'ai

Réponses:

66

J'ai bien peur que l'URL des sous-modules pointe toujours vers le référentiel - vous ne pouvez pas spécifier que vous voulez uniquement un sous-dossier d'un référentiel, de la même manière que git ne supporte pas les "clones étroits" en général.

Si vous ne pouvez pas vivre avec tout le référentiel en tant que sous-module, vous pouvez toujours créer un nouveau référentiel cloné à partir de boto, puis configurer une tâche cron pour:

  1. git fetch ce référentiel dans un répertoire
  2. Permet git filter-branchde mettre à jour une branche où le sous-répertoire est au niveau supérieur.
  3. Ajoutez cette branche du référentiel en tant que sous-module. Cependant, tout cela est un peu délicat et ma préférence serait simplement de vivre avec tout le référentiel en tant que sous-module.
Mark Longair
la source
24

Vous ne pouvez pas cloner uniquement une partie d'un référentiel. C'est parce que git traite le référentiel comme un objet entier: quand vous l'obtenez, vous obtenez tout .

Donc, la solution ici serait de récupérer le sous-module dans un autre répertoire, puis d'utiliser un lien symbolique pour atteindre votre objectif.

Artefact2
la source
J'ai des liens symboliques dans Windows ... fonctionne bien aussi. (c'est à cause de msys que j'ai sur ma machine, donc je peux utiliser ln -scomme sous Linux)
kumarharsh
7
Vista et & viennent avec MKLink. J'utilise ça. howtogeek.com/howto/windows-vista
Angel S. Moreno
1
Vous pouvez utiliser des liens
physiques à la
15

Ce que vous voulez faire, c'est créer une branche dans le sous-module, déplacer le dossier vers le haut et supprimer ce dont vous n'avez pas besoin. Vous pouvez ensuite gérer cette branche à la place. Si vous souhaitez augmenter vos modifications, vous devez d'abord pouvoir effectuer la fusion arrière. Git saura que vous avez déplacé les fichiers et effectué la fusion avec succès.

J'espère que cela t'aides.

Adam Dymitruk
la source
Qu'est-ce qu'une «fusion arrière»? Pouvez-vous donner un exemple?
Sukima
une fusion qui va «en amont» - d'une branche d'ordre supérieur à une branche d'ordre inférieur. Linus les déteste. Ils sont liés à l'histoire d'autres branches qui ont peut-être déjà été fusionnées.
Adam Dymitruk
Pourriez-vous s'il vous plaît ajouter un exemple de «fusion arrière» dans cette situation?
Xiao
C'est généralement lorsque vous essayez de maintenir votre branche de fonctionnalités à jour en fusionnant des éléments d'une branche principale où tout le monde fusionne ses dernières modifications. C'est mauvais parce que cela lie votre branche au travail des autres. Si le produit nécessite votre succursale mais pas l'une des autres déjà dans la branche d'intégration, ce n'est pas possible.
Adam Dymitruk
idée intéressante, quelqu'un a-t-il essayé cela? Je vais essayer bientôt, mais toujours pas sûr que le "back merge" puisse être clair et automatisé ...
moudrick