Penso che il problema qui sia una discrepanza tra la progettazione di Git e il problema che si sta cercando di risolvere.
Git è buono per tenere traccia degli alberi. Le relazioni di dipendenza tra progetti possono (e probabilmente lo fanno) formare un grafico. Un albero è un grafico ma un grafico non è necessariamente un albero. Poiché il tuo problema è come rappresentare efficacemente un grafico, un albero non è lo strumento migliore per il lavoro.
Ecco un approccio che potrebbe funzionare:
Un progetto Git ha una directory .gitmodules dove si registra "suggerimenti", affermando che proietta un commit può dipendere, dove possono essere trovati, e quale percorso all'interno del progetto dovrebbero essere inseriti in (http://osdir.com/ml/git/2009-04/msg00746.html)
È possibile aggiungere uno script che legge queste informazioni da un insieme di progetti, mappare gli hint trovati nel file .gitmodules di ciascun progetto nelle posizioni sul file system in cui sono stati effettivamente posizionati tali progetti e quindi aggiunge simboli collegamenti dai percorsi in cui git prevede di controllare i sottomoduli nelle posizioni dei filesystem effettivi dei rispettivi progetti.
Questo approccio utilizza collegamenti simbolici per uscire dallo stampo Albero e creare un grafico. Se registriamo i collegamenti direttamente in repository git, avremmo percorsi relativi specifici per la nostra configurazione locale registrati nei singoli progetti, e i progetti non sarebbero "completamente indipendenti" come volevi. Quindi, lo script per creare dinamicamente i collegamenti simbolici.
Sto pensando che questo approccio potrebbe interferire con git in modi indesiderati, dal momento che abbiamo intrapreso percorsi in cui ci si aspetta di trovare una cosa, e invece mettere qualcos'altro lì. Forse potremmo .gitignore i percorsi dei link simbolici. Ma ora stiamo scrivendo quei percorsi due volte e violando DRY. A questo punto siamo anche andati molto lontano dal fingere di usare i sottomoduli. Potremmo registrare le dipendenze altrove in ogni progetto e lasciare il file .gitmodules per le cose che git si aspetta. Quindi creeremo il nostro file, diciamo, .dipendenze, e ogni progetto può indicarne le dipendenze. Il nostro script guarderà lì e poi andrà a costruire i suoi symlink.
Hmm, penso che forse ho appena descritto un sistema di gestione dei pacchetti ad hoc, con un proprio formato di pacchetto leggero :) suggerimento
di megamic sembra un buon uso di sottomoduli git a me.Ci occupiamo solo di tenere traccia di un Set qui piuttosto che di un Grafico, e un Set si adatta facilmente ad un Albero. Un albero ad un livello profondo è essenzialmente un nodo genitore e un insieme di nodi figli.
Come hai sottolineato, ciò non risolve completamente il problema indicato nella tua domanda. Possiamo distinguere due distinti tipi di "questo funziona con quello" informazioni che probabilmente sono interessate a: 1. Una dichiarazione da una versione di un progetto (presumibilmente dall'autore del progetto) che dice "Richiedo la versione X del progetto Y" 2. Una dichiarazione usata dal proprio setup di costruzione che dice "Ho testato con successo tutto il nostro sistema usando questo insieme di versioni di progetto"
risposta di megamic risolta (2) ma per (1) vogliamo ancora che i progetti ci dicano quali sono le loro dipendenze. Quindi possiamo usare le informazioni da (1) per calcolare quei set di versioni che finiremo per registrare come (2). Questo è un problema abbastanza complesso da giustificare il proprio strumento, che ci riporta ai sistemi di gestione dei pacchetti :)
Per quanto ne so, la maggior parte dei buoni strumenti di gestione dei pacchetti sono realizzati per gli utenti di un linguaggio o sistema operativo specifico . Vedi Bundler per pacchetti "gem" nel mondo ruby e apt per pacchetti ".deb" nel mondo Debian.
Se qualcuno sa di una buona soluzione neutra, neutrale rispetto al sistema operativo, adatta ai progetti di programmazione "poliglotta" (http://blog.heroku.com/archives/2011/8/3/polyglot_platform/), sarei molto interessato! Dovrei postarlo come una domanda.
Super è un progetto in sé. Non dare per scontato che non abbia contenuto solo perché l'ho chiamato Super. –
Ma voglio che ogni progetto sia indipendente. E mi piace che i sottomoduli git siano corretti su un commit particolare invece di seguire come gli svn esterni, in modo che una modifica in Core non rompa immediatamente A, B e Super. –
Indipendentemente dal fatto che segui i rami o esegui il commit degli SHA. Ma la risposta migliore per il tuo problema è che non è davvero possibile avere l'opzione stand-alone e il super-progetto. In pratica ho scoperto che avere un super progetto per ogni sottoprogetto non è un grosso problema. –