Anche se qui ci sono molte domande simili sull'uso di GIT per il mantenimento di versioni diverse, nessuna sembra rispondere al mio caso specifico.
Sto bene con come usare GIT per fare il mio sviluppo, usando diversi rami per fare hot fix, versioning ecc.
Tuttavia, sto creando un'applicazione commerciale che deve monitorare vari moduli e configurazioni per i client DIFFERENT . E NON desidero che il cliente abbia accesso a un modulo o codice che non ha pagato. Tuttavia vorrei utilizzare GIT per implementare sul proprio server, o essere in grado di distribuire direttamente sul server client usando ssh / rsync, o anche sul mio server in una directory univoca, quindi comprimere i file sorgente usando un processo standard.
Lasciatemi fare un esempio:
Client A:
- Distribuisci applicazione di base
- Distribuisci il modulo A (ad es. forum) solo
- Distribuzione del client Un tema specifico con il cliente Un logo specifico
Client B:
- Distribuisci applicazione di base
- Distribuisci il modulo A (ad es. forum)
- Distribuisci il modulo B (ad es. sistema faq)
- Distribuisci il tema specifico del Cliente B con il logo specifico del Cliente B
Server di sviluppo:
- Contiene l'applicazione di base
- Contiene il modulo A (ad esempio il forum)
- Contiene il modulo B (ad esempio il sistema faq)
- Contiene temi del client A e del client B con tutti i loghi
- Contiene le note di sviluppo che NON devono essere visibili al cliente
- Contiene i file di build utilizzati con Phing - questi NON devono essere disponibili per i client
È molto importante capire che GIT sul server di sviluppo contiene dati proprietari per client A e client B. Pertanto il client A non deve mai vedere le note di sviluppo, i file di build di Phing, il modulo B (sistema faq) o codice / dati / immagini per il cliente B.
Non ho bisogno di mantenere le variazioni di un modulo o dell'applicazione di base per i singoli clienti. Tutto è standard in tutto il sistema ed è solo la configurazione / variante di distribuzione per ciascun client che è unica.
Sono felice di utilizzare i sottomoduli GIT per mantenere separate alcune parti, se questo aiuta.
Si noti che tutto il mio codice è in PHP e sono felice di implementare soluzioni usando PHP, Perl, Python o scripting, ma non voglio usare Java sul server di destinazione. Idealmente, vorrei evitare le soluzioni Ruby, se possibile. Ho accesso a SSH sul server client e posso usare rsync anche su SSH, ma devo essere in grado di eseguire uno script sul server client per pulire le cache ecc. Dopo un aggiornamento.
La mia macchina di sviluppo è Windows - sì, sfortunata, ma vera. Se non riesco a ottenere ciò di cui ho bisogno su Windows, eseguirò CentOS / Fedora in VMWare.
Questa non è una distribuzione multi-server che richiede l'aggiornamento simultaneo in una server farm, sebbene sarebbe bello poter distribuire gli aggiornamenti dell'applicazione a tutti i vari client in base a una pianificazione o utilizzando un singolo comando / procedura anziché doverlo fare manualmente per ognuno. Dovrei anche essere in grado di inviare aggiornamenti specifici del client ai singoli client come e quando richiesto (ad esempio gli aggiornamenti HTML o logo).
Quindi, posso usare GIT per la distribuzione, o perlomeno monitorare le varie configurazioni usando le filiali? O sarà semplicemente troppo disordinato?
Posso nascondere il client B dal client A, incluso lo storico del commit, in un particolare ramo, per assicurarmi che qualcuno esperto di GIT presso l'organizzazione del cliente non possa recuperare il codice che non deve vedere (e questo è un contrattuale requisito del progetto)? In tal caso, come faccio a farlo in GIT?
In caso contrario, come posso best gestire un processo di compilazione che mi consenta di implementare configurazioni specifiche per il cliente? Si noti che inizialmente gestirò circa 20 diversi client, e questo potrebbe crescere fino a 100 o più configurazioni diverse poiché ognuno includerà il proprio HTML e loghi e una variazione basata su una selezione potenzialmente unica di 15-20 moduli.
Sono felice di mantenere un centinaio di file di configurazione XML diversi se è quello che serve. Sono a conoscenza di Capistrano, ma dal leggerlo, non mi sembra adatto al mio caso specifico. Se ti senti in altro modo, per favore sentiti libero di indicarlo.