Projets dans le cadre de projets à l'aide de Git
Comment puis-je configurer un projet Git contient d'autres projets?
par exemple. Je travaille sur une application de cartographie en ligne. Nous avons développé un outil GPS avec une tenue en SF. Nous avons dans le même temps développé un Python Geomapping script avec une autre préoccupation (qui se soucie uniquement de geomapping). Nos propres fichiers de base de réunir les deux, et s'en inspirer pour l'application dont nous avons besoin.
Chacun des projets doit exister par elle - même, les gens qui ont un intérêt dans le GPS seulement avoir un intérêt dans le GPS mais le "parent" du projet qui comprend tous les autres doivent être accessibles dans un projet.
J'ai passé du temps à essayer de comprendre submodules, mais ils semblent avoir trop de l'indépendance pour ce qui est nécessaire.
Également, si possible, ce serait bien si chacun de ces projets pourrait contenir un ou deux cumul des scripts. Pourrait un projet Git inclure un fichier qui ne fait pas partie de ses "racines", de sorte que lorsque ce fichier est mis à jour par une équipe à la fois peut en bénéficier?
Est-ce faisable avec Git? Avec Mercurial? Ne l'hôte (GitHub, Gitorious) de la matière?
J'ai l'idée d'utiliser Subversion pour le "parent", ignorant le .git dossiers, et l'utilisation de Git pour les projets (en l'ignorant .svn dossiers) - mais ce n'est qu'un dernier recours.
edit:
Pour expliquer pourquoi je ne veux pas Submodules:
- Lorsque les utilisateurs télécharger le zip ne comprennent pas les submodules (ici & ici).
Idem quand même des collaborateurs essayons de mettre en place le projet. C'est un show stopper. - Submodules gelés, ils ne le font pas (facilement) ramasser la dernière version du projet qui est en train d'être souligné.
- D'autres raisons comme l'a souligné dans le fantastique réponses ci-dessous et dans ce monologue à NoPugs.
Sous-arbre de fusion (présenté à moi par Paul, ci-dessous) ne fera pas: Il est difficile de mettre à jour la source [d'un sous-arbre] de l'intérieur le projet, il est fusionné, et que la source doivent résider à l'extérieur de la "racine" du dossier du projet. Étant une application web, il est essentiel que toutes mes pages un lien interne vers un dossier, et que les essais et les mises à jour se faire directement dans ce dossier. (J'espère que cela est clair et utile pour les autres.)
Encore l'étude de la configuration à distance des branches", mais d'autres idées sont toujours les bienvenus.
- Les raisons pour lesquelles je suis contre git-sous-module: a) je ne peux pas le faire fonctionner. GIT Bash se bloque sur la commande pour ajouter des sous-module.. b) Submodules doivent être mis à jour indépendamment. Mieux pour moi d'avoir la dernière version de la submodules automatiquement. c) Ne submodules avoir le code, ou un pointeur?
- Paul - avez-vous des tutoriels pour la deuxième méthode. Je viens de trouver GIT assez difficile. Aussi, importe-t-il que les sous-projets sont stockées localement dans le projet parent avec ces méthodes (super-classe/classes/subproject1)?
- La sous-Arborescence de la méthode pour les mettre dans un sous-répertoire distinct, mais qui peut être n'importe où. Git pistes de l'ensemble de l'arborescence du projet, plutôt que des fichiers individuels, de sorte que toute disposition de fichier fonctionne pour la télécommande de la ramification de la méthode. Je ne sais pas d'une écriture-up de la dernière méthode; j'ai ajouté les liens de la sous-arborescence de la méthode.
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas trouvé submodules être particulièrement utile sur les (petits) projets sur lesquels j'ai travaillé. Une fois que vous avez mis en place, le travail sur l'ensemble du projet nécessite l'ajout de paramètres supplémentaires à presque toutes les commandes et la syntaxe n'est pas tout à fait régulière. J'imagine que si j'ai travaillé sur de gros projets avec plus submodules, je préfère le voir comme l'un des plus bénéfiques compromis.
Il y a deux possibilités qui gardent les sous-projets indépendants git repos que tirez-vous de votre main (intégration) repo:
À l'aide de sous-arbre de fusion pour apporter à vos projets externes dans différents sous-répertoires dans votre repo qui comprend vos fichiers de base. Cela rend plus facile pour mettre à jour le projet principal de l'extérieur par les projets, mais compliqué à envoyer des modifications aux projets externes. Je pense que c'est une bonne manière d'inclure les dépendances d'un projet, mais il ne fonctionne pas avec des fichiers partagés. Une autre explication simple (lien corrigé).
De chaque projet comme une branche distante dans votre repo et de fusion de chacun d'eux dans votre
master
(intégration) de la branche qui contient vos fichiers de base. Cela demande de la discipline: si vous apportez des modifications aux projets externes à votre repo, ils doivent être faits dans la branche et ensuite fusionnées dans le maître; et vous ne voulez jamais à se fondre dans le projet de branches. Cela rend plus facile pour envoyer des modifications aux projets externes et est parfaitement acceptable d'utiliser des branches de Git.Vos scripts peuvent être traités comme une autre branche indépendante dans votre répertoire principal qui vos partenaires externes peuvent tirer et de pousser à une branche distante.
Si vous essayez d'exécuter SVN & Git dans le même répertoire, il est très difficile d'utiliser la ramification dans le système, parce que SVN ne ramification par la copie des fichiers des répertoires tandis que Git pistes de pointeurs. Ni le système affiche automatiquement les branches de vous rendre dans les autres. Je pense que la "solution" est plus d'ennuis que cela vaut la peine.
J'ai utilisé git pour assembler mon propre github projet hébergé et externe de l'INTERFACE utilisateur de la bibliothèque que je voulais utiliser. La bibliothèque est hébergé dans un dépôt subversion sur le site de sourceforge.
J'ai utilisé git-sous-module et git-svn et cela a fonctionné raisonnablement bien. Les inconvénients ont été:
Afin de garder à jour avec la bibliothèque de dépôt, j'ai eu à effectuer un nouveau s'engagent à mettre à jour le sous-module git de hachage "pointeur". C'est parce que les submodules, à la différence de la propriété svn:externals, sont fixés à un particulier d'engager id. Cela peut ne pas être un réel inconvénient si vous voulez réellement à la broche une version stable, je travaillais avec le code qui a été WIP.
L'attraction initiale d'un repo git avec submodules nécessite une étape supplémentaire avec "git sous-module init". Ce n'est pas un problème pour vous, mais pour d'autres, à l'aide de votre code, ils auront à se rappeler ou à être dit pour effectuer cette étape avant de compiler/exécuter/test de votre code.
Si vous utilisez la ligne de commande, il est facile de bousiller votre référentiel git-ajouter. C'est parce que vous tapez
git add subm<tab>
pour terminer àgit add submodule
, mais il s'est auto-complète àgit add submodule/
- note le slash. Si vous exécutez la commande avec le slash de fin, puis il éclair le sous-module et ajoute de l'ensemble de ses fichiers à la place. Ceci est atténué par l'utilisation de git-gui,git add .
ou tout simplement une formation vous-même pour supprimer la barre oblique (il m'est arrivé assez souvent que je me suis formé moi-même de le supprimer)Submodules commet peut gâcher git rebase -i. J'oublie les détails exacts, mais il est particulièrement mauvais si vous avez un "sale" sous-module et que vous exécutez un rebase interactif. Normalement, avec un sale arbre, vous ne pouvez pas rebase, mais submodules ne sont pas vérifiées. Le fait d'avoir plusieurs sous-module s'engage dans un rebase groupe provoque également des problèmes. La dernière sous-module de hachage devient engagé à le premier choix sur votre liste, et c'est assez délicat à résoudre plus tard. Cela peut être contourné avec une plus prudent de flux de travail (c'est à dire avec soin de décider quand faire votre sous-module s'engage...) mais peut être un pain PITA.
Les étapes de cette série ont été quelque chose le long des lignes de:
git svn clone https://project.svn.sourceforge.net/svnroot/project/project/trunk
git submodule init
git submodule add git://github.com/project subproject
Qui est-il, plus ou moins. Vous aurez un nouveau répertoire "sous-projet", qui, dans votre cas, serait l'geomapping bibliothèque.
Chaque fois que vous devez mettre à jour les geomapping code, vous devez exécuter quelque chose comme:
Je ne l'ai pas vu à de nombreux tutoriels sur un git sous-module de flux de travail, donc j'espère que cela vous aide à décider.
git-sous-module pourrait être ce que vous cherchez:
http://book.git-scm.com/5_submodules.html
http://git-scm.org/gitwiki/GitSubmoduleTutorial
D'après le peu que j'ai lu sur Externals, il semble être un port de SVN 'alias' GIT.
Cette résout certains problèmes avec les submodules, y compris la mise à jour vers la dernière version automatiquement.
Alors que je n'ai aucune expérience avec SVN externes ou avec ce projet, il pourrait être une meilleure solution pour certains que tous les autres publiés.
Sinon, les logiciels suivants (ressemble, il peut être utilisé avec GitHub). Peut-être un autre moyen pour certains de la peau du chat:
Tresse (Softpedia page)
Cela dépend du type de projet sur lequel vous travaillez, et quels sont les outils, le cas échéant, besoin d'interagir avec votre MEC. Rails, par exemple, utilise souvent Capistrano à déployer, et Capistrano fait des hypothèses sur ce que votre structure de répertoire va ressembler par rapport à la racine de votre dépôt. Dans ce cas, si vous avez plusieurs interdépendants rails des applications, vous avez besoin d'utiliser des submodules. Chaque application possède son propre référentiel, et puis vous avez un plus grand dépôt qui gère chacun des indépendants dépôts comme submodules.
Même si vous n'avez pas les outils qui font ce genre d'hypothèses, de bonne référentiel de conception nécessite de casser un peu les choses si il y a la moindre possibilité qu'un jour, vous pourriez vouloir utiliser un paragraphe d'un projet plus vaste de manière indépendante, ou de réutiliser une grande parcelle de code à l'intérieur de certains projet indépendant.
L'extraction de certains sous-section d'un référentiel comme sa propre entité distincte, tout en maintenant la version de l'histoire est difficile à git, et c'est donc une bonne idée de planifier à l'avance.
Comme spécifiques à votre question, honnêtement, je dirais que ce que un parfait exemple où un couple submodules serait l'idéal. En matière de partage des scripts, si, pour quelque raison que c'est effectivement un problème qui s'avère problématique, vous pouvez toujours utiliser un lien symbolique.