2010-07-08 3 views
10

J'utilise la commande subtree de Git pour insérer deux bibliothèques dans un projet. Si je clone ensuite le projet de la manière normale, je me retrouve avec tout le code dont j'ai besoin, mais je perds les relations de sous-arbre - dans le clone, il n'y a pas de télécommande pour chacune des bibliothèques, et il n'y a pas de -branche pour l'un ou l'autre.Procédure de clonage des dépôts Git qui utilisent la sous-arborescence

Quelle est la meilleure façon de rétablir cette connexion?

Est-il suffisant pour faire

git remote add <lib> <remote-url> 
git fetch <lib> 

Si j'ajoutais la bibliothèque pour la première fois que je suis cela avec:

git subtree add -P <local/lib> --squash "<lib>/master" 

Cela ne fonctionne pas lorsque le répertoire local déjà existe cependant, ce qui bien sûr arrivera lorsque vous aurez cloné un projet auquel la bibliothèque a déjà été ajoutée.

Y a-t-il quelque chose d'autre à faire dans cette situation, pour s'assurer que les sous-arbres git subsidee subséquents et les sous-arbres de git fassent l'objet escompté?

+0

'git subtree' n'est pas une commande git standard ... –

+0

" Une alternative expérimentale à la commande git-submodule "- https://github.com/apenwarr/git-subtree/ –

Répondre

3

La façon dont j'ai dans le passé recréé cette relation était en faisant une fusion de sous-arbre. Même s'il n'y a rien à fusionner dans/pull, il devrait simplement retourner sans rien faire. N'hésitez pas à ajouter --squash à l'extraction ci-dessus afin de ne tirer aucun historique à distance.

8

J'ai eu très problème similaire

Voici comment j'ai créé le sous-arbre au premier

git remote add -f sub_project url_to_remote_repository/project.git 
git merge -s ours --no-commit sub_project/master 
git read-tree --prefix=sub/project/ -u sub_project/master 
git commit -m "Added subtree merged in sub/project" 

et d'obtenir des changements de la prise en pension « projet », je faisais

git pull -s subtree sub_project master 

Maintenant, j'ai poussé mon dépôt local à github et à partir d'une autre machine, j'ai cloné mon dépôt github À ce stade, j'ai eu tous les le dans le sous/projet ... alors c'est génial. Mais pas plus à distance, et relation avec sous-projet /. Je l'ai fait ce qui suit

git remote add -f sub_project url_to_remote_repository/project.git 
git merge -s ours --no-commit --squash sub_project/master 
git pull -s subtree sub_project master 

Et cela a bien fonctionné. Maintenant, je suis en mesure de gérer la sous-arborescence de ce dépôt cloné comme avant

git pull -s subtree sub_project master 

Note:

1) dans notre projet, avant que nous utilisions sous-modules git qui était vraiment pas bon pour nos utilisateurs. C'est pourquoi nous sommes passés au système de sous-arbre de git.
2) J'ai eu quelques erreurs bizarres lors de ces opérations sur la machine Windows (en utilisant git version 1.7.9.msysgit.0), et les mêmes opérations ont été réussies sur Linux. Alors maintenant, pour manipuler le sous-arbre, j'utilise souvent linux (et si j'ai une erreur, j'essaie la même chose sur Linux).

Espérons que cela peut aider.

+1

Je ne sais pas comprendre comment le mappage de préfixe de sous-répertoire est rétabli dans la séquence de commandes que vous avez décrite après un nouveau clone. Ne devrait-il pas y avoir un "sous-projet" quelque part dans les commandes? –

+0

Lorsque j'ai essayé la commande de fusion ci-dessus, elle a essayé de tout fusionner au niveau supérieur de mon projet. Cette commande a semblé fonctionner cependant: "git merge --squash -s récursive -Xsubtree = sous/project --no-commit tracking_branch" –

+0

En fait ceci a fonctionné encore mieux: "git merge --squash -sous -Xsubtree = sub/projet --no-commit tracking_branch " –

0

je suis tombé sur cette question lors de la migration d'un projet d'utiliser à sous-modules et sous-arbres ont fini par utiliser ni (au moins pas directement, de toute façon) - Je suis maintenant en utilisant l'outil git-subrepo.

Il résout ce problème en ajoutant un fichier .gitrepo à la racine de chaque sous-arbre. Le fichier .gitrepo contient des informations de suivi, y compris l'URL distante, et est ensuite inclus dans les clones suivants. Cela simplifie vraiment les choses et la seule complication est que git-subrepo doit être installé séparément sur chaque machine de développement (bien que le référentiel soit toujours utilisable sans elle).

Questions connexes