Je pense que le problème ici est une discordance entre la conception de Git et le problème que vous cherchez à résoudre.
Git est bon pour le suivi des arbres. Les relations de dépendance entre les projets peuvent (et probablement le font) former un graphique. Un arbre est un graphique mais un graphique n'est pas nécessairement un arbre. Puisque votre problème est de savoir comment représenter efficacement un graphique, un arbre n'est pas le meilleur outil pour le travail.
est ici une approche qui pourrait fonctionner:
Un projet git a un répertoire .gitmodules où il enregistre « indices » indiquant quels projets une livraison peut dépendre, où ils se trouvent, et quel chemin à l'intérieur du projet ils devraient être insérés à. (http://osdir.com/ml/git/2009-04/msg00746.html)
Vous pouvez ajouter un script qui lit ces informations à partir d'un ensemble de projets, mappe les indications trouvées dans le fichier .gitmodules de chaque projet vers les emplacements du système de fichiers où ces projets ont été placés, puis ajoute des symboles liens à partir des chemins où git s'attend à vérifier les sous-modules aux emplacements réels du système de fichiers des projets respectifs.
Cette approche utilise des liens symboliques pour sortir du moule Arbre et créer un graphique. Si nous enregistrons les liens directement dans les repos git, nous aurons des chemins relatifs spécifiques à notre configuration locale enregistrés dans les projets individuels, et les projets ne seront pas 'complètement indépendants' comme vous le vouliez. Par conséquent, le script pour construire dynamiquement les liens symboliques.
Je pense que cette approche pourrait interférer avec git de manière indésirable, puisque nous avons pris des chemins où elle s'attend à trouver une chose, et y mettre quelque chose d'autre à la place. Peut-être que nous pourrions .gitignore les chemins de lien symbolique. Mais maintenant nous écrivons ces chemins deux fois et violons DRY. À ce stade, nous sommes également très loin de faire semblant d'utiliser des sous-modules. Nous pourrions enregistrer les dépendances ailleurs dans chaque projet, et laisser le fichier .gitmodules pour les choses attendues par git. Nous allons donc créer notre propre fichier, disons, .dependencies, et chaque projet peut y indiquer ses dépendances. Notre script va regarder là-bas, puis va construire ses liens symboliques.
Hmm, je pense que je viens de décrire un système de gestion package ad-hoc, avec son propre format de package léger :) suggestion de
megamic semble être une bonne utilisation des sous-modules git pour moi.Nous ne traitons ici que du tracé d'un ensemble plutôt que d'un graphique, et un ensemble se glisse facilement dans un arbre. Un arbre profond d'un niveau est essentiellement un nœud parent et un ensemble de nœuds enfants.
Comme vous l'avez souligné, cela ne résout pas complètement le problème énoncé dans votre question. Nous pouvons distinguer deux types distincts d'informations «cela marche avec ça» qui nous intéressent: 1. Une déclaration d'une version d'un projet (vraisemblablement par l'auteur du projet) disant «J'ai besoin de la version X du projet Y» 2. Une déclaration utilisée par votre propre configuration de construction indiquant "J'ai testé avec succès notre système en utilisant cet ensemble de versions de projet"
réponse de megamic résolue (2) mais pour (1) nous voulons toujours que les projets nous disent quelles sont leurs dépendances. Ensuite, nous pouvons utiliser l'info de (1) pour calculer ces ensembles de versions que nous finirons par enregistrer comme (2). Pour autant que je sache, la plupart des bons outils de gestion de paquets sont conçus pour les utilisateurs d'une langue ou d'un système d'exploitation spécifiques.
. Voir Bundler pour les paquets 'gem' dans le monde de ruby et apt pour les paquets '.deb' dans le monde Debian.
Si quelqu'un connaît une bonne solution neutre pour le système d'exploitation, neutre pour le langage, qui convient bien aux projets de programmation 'polyglotte' (http://blog.heroku.com/archives/2011/8/3/polyglot_platform/), je serais très intéressé! Je devrais afficher cela comme une question.
Super est un projet en soi. Ne supposez pas qu'il n'a pas de contenu juste parce que je l'ai appelé Super. –
Mais je veux que chaque projet soit autonome. Et j'aime que les sous-modules git soient fixés à un commit particulier au lieu de suivre comme svn externals, de sorte qu'un changement de Core ne rompe pas immédiatement A, B et Super. –
Que vous suiviez des branches ou que vous commettiez des SHA, c'est à vous de décider. Mais la meilleure réponse à votre problème est qu'il n'est pas vraiment possible d'avoir à la fois l'option autonome et l'option super-projet. En pratique, j'ai trouvé qu'un super-projet pour chaque sous-projet n'est pas si important. –