132 votes

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

L'écrémage le tutoriel SubModule J'ai créé un sous-module à partir du module projet boto . Puis, j'ai découvert que je n'avais en fait besoin que d'un sous-ensemble de ce projet - plus précisément, le projet boto dossier.

Je voudrais modifier 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 à la place de https://github.com/boto/boto.git ? Après avoir changé l'URL, dois-je supprimer le dossier boto localement et le ré-assembler ?

4 votes

Ce n'est pas exactement ce que vous voulez - pas un sous-module - mais vous pouvez jeter un coup d'œil à git subtree

2 votes

Ce que j'ai fini par faire est d'avoir le sous-module entier, et de dire à IntelliJ que le dossier boto est un "dossier source", de sorte qu'il peut trouver des paquets dans celui-ci.

25 votes

Je n'arrive pas à croire que git ne fasse pas cela nativement...yikes.

82voto

Mark Longair Points 93104

J'ai bien peur que l'URL des submodules ne pointe toujours que vers le dépôt - vous ne pouvez pas spécifier que vous voulez seulement un sous-dossier d'un dépôt, 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 l'ensemble du dépôt en tant que sous-module, vous pouvez toujours créer un nouveau dépôt cloné à partir de boto et mettre en place une tâche cron :

  1. git fetch ce référentiel dans un répertoire
  2. Utilice git filter-branch pour 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 compliqué et ma préférence serait de vivre avec l'ensemble du référentiel en tant que sous-module.

32voto

Artefact2 Points 2987

Vous ne pouvez pas cloner seulement une partie d'un référentiel. Ceci est dû au fait que git traite le dépôt comme un objet entier : quand vous l'obtenez, vous l'obtenez. todo .

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.

0 votes

J'ai des liens symboliques dans Windows... ça marche bien aussi. (c'est à cause de msys que j'ai sur ma machine, donc je peux utiliser ln -s comme sous linux)

7 votes

Vista et & sont livrés avec MKLink. Je l'utilise. howtogeek.com/howto/Windows-vista/

1 votes

Vous pouvez utiliser des liens directs à la place

18voto

Adam Dymitruk Points 34999

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 alors gérer cette branche à la place. Si vous voulez pousser vos changements, vous devriez pouvoir faire une rétro-fusion d'abord. Git saura que vous avez déplacé les fichiers et effectuera la fusion avec succès.

J'espère que cela vous aidera.

2 votes

Qu'est-ce qu'une "rétrofusion" ? Pouvez-vous nous donner un exemple ?

0 votes

Une fusion qui va "en amont" - d'une branche d'ordre supérieur à une branche d'ordre inférieur. Linus les déteste. Elles relient l'histoire d'autres branches qui ont peut-être déjà été fusionnées.

0 votes

Pourriez-vous ajouter un exemple de "back merge" dans cette situation ?

12voto

Justin Hammond Points 106

Toutes les réponses ici sont assez datées. Vous pourriez utiliser les plus récentes git sparse-checkout commande documents ici d'autres exemples dans cet article pour saisir des morceaux d'un repo. C'est efficace si vous ne voulez qu'un répertoire ou deux d'un projet git plus important.

TLDR :

git sparse-checkout init --cone
git sparse-checkout set <dir1> <dir2> ...
git checkout main

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X