Je pense que le problème ici est une inadéquation entre la conception de Git et le problème que vous cherchez à résoudre.
Git permet de garder la trace de Trees. Les relations de dépendance entre les projets peuvent former (et forment probablement) un graphe. 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 ce travail.
Voici une approche qui pourrait fonctionner :
Un projet git possède un répertoire .gitmodules dans lequel il enregistre des "indices" indiquant les projets dont un commit peut dépendre, où ils peuvent être trouvés et à quel chemin dans le projet ils sont censés être insérés. ( http://osdir.com/ml/git/2009-04/msg00746.html )
Vous pourriez ajouter un script qui lit ces informations à partir d'un ensemble de projets, fait correspondre les indices trouvés dans le fichier .gitmodules de chaque projet aux emplacements sur le système de fichiers où ces projets ont réellement été placés, puis ajoute des liens symboliques à partir des chemins où git s'attend à extraire des submodules vers les emplacements réels sur le système de fichiers des projets respectifs.
Cette approche utilise des liens symboliques pour sortir du moule de l'arbre et construire un graphique. Si nous enregistrons les liens directement dans les dépôts git, nous aurions des chemins relatifs spécifiques à notre configuration locale enregistrés dans les projets individuels, et les projets ne seraient pas " totalement indépendants " comme vous le souhaitiez. D'où 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ù il s'attend à trouver une chose, et mis autre chose à la place. Peut-être que nous pourrions .gitignore les chemins des liens symboliques. Mais maintenant nous écrivons ces chemins deux fois et violons DRY. À ce stade, nous nous sommes également éloignés de l'idée d'utiliser des submodules. Nous pourrions enregistrer les dépendances ailleurs dans chaque projet, et laisser le fichier .gitmodules pour les choses que git attend. Nous allons donc créer notre propre fichier, disons, .dependencies, et chaque projet pourra y indiquer ses dépendances. Notre script regardera là et ira ensuite construire ses liens symboliques.
Hmm, je pense que je viens de décrire un système de gestion de paquets ad-hoc, avec son propre format de paquet léger :)
La suggestion de megamic me semble être une bonne utilisation des submodules git. Il ne s'agit ici que de garder la trace d'un ensemble plutôt que d'un graphique, et un ensemble s'intègre facilement dans un arbre. Un arbre d'un niveau de profondeur 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 "ceci fonctionne avec cela" qui sont susceptibles de nous intéresser : 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 disant "J'ai testé avec succès notre système entier en utilisant cet ensemble de versions du projet".
La réponse de megamic a résolu (2) mais pour (1) nous voulons toujours que les projets nous disent quelles sont leurs dépendances. Ensuite, nous pouvons utiliser les informations de (1) pour calculer ces ensembles de versions que nous finirons par enregistrer comme (2). C'est un problème suffisamment complexe pour justifier son propre outil, ce qui nous ramène aux systèmes de gestion de paquets :)
Pour autant que je sache, la plupart des bons outils de gestion de paquets sont conçus pour les utilisateurs d'un langage ou d'un système d'exploitation spécifique. Voir Bundler pour les paquets 'gem' dans le monde ruby et apt pour les paquets '.deb' dans le monde Debian.
Si quelqu'un connaît une bonne solution, neutre en termes de langue et de système d'exploitation, qui soit adaptée aux besoins des utilisateurs "polyglottes" ( http://blog.heroku.com/archives/2011/8/3/polyglot_platform/ ) des projets de programmation, je serais très intéressé ! Je devrais poster cela comme une question.