2011-12-30 17 views
7

Questa è una domanda che sembra venire semi-frequentemente, ma purtroppo non ho trovato una risposta che io possa applicare pienamente alla mia situazione ancora, quindi ho pensato di fare la mia stessa domanda . Questa è la mia prima domanda su SO, quindi sii gentile. : PRepository multipli in una directory

Il "problema": nostra azienda sviluppa molteplici applicazioni PHP, ma una di quelle applicazioni è un "maestro" di sorta. Tutte le altre nostre applicazioni sono installate all'interno di questa "applicazione master" e richiedono il funzionamento dell'applicazione principale.

Utilizziamo il controllo di versione per gestire queste applicazioni, ovviamente.

Mentre molti dei file nelle nostre applicazioni di aggiunta sono nelle sottodirectory, non tutti lo sono. Ciò significa che non possiamo usare l'importazione sottodirectory (estensioni svn, sottomoduli git, ecc.). Ad esempio, all'interno della cartella root ci sono diverse cartelle (admin, public, kernel e così via) e le applicazioni addon hanno file all'interno di una o più di queste cartelle - non sono autonomamente indipendenti all'interno della struttura di directory dell'applicazione master .

Attualmente utilizziamo SVN e recentemente ci siamo trovati a considerare git a causa di alcune delle funzionalità disponibili che riteniamo potrebbero essere utili a noi. Una cosa su cui non sono chiaro è, tuttavia, se esiste davvero un modo per "unire" (non nel senso di controllo della versione) questi repository in una singola directory localmente quando gli sviluppatori stanno lavorando sul codice. Neanche io ho trovato un modo per farlo con SVN.

In un mondo ideale, avremmo un repository per la nostra applicazione "master" con una struttura in questo modo:

  • /
  • --file1
  • --file2
  • -/admin
  • ---- file1
  • ---- file2
  • -/pubblici
  • ---- file1

La nostra applicazione addon avrebbe una struttura in questo modo (ricordate, abbiamo più applicazioni addon):

  • /
  • --filex
  • -/admin
  • ----/myapp
  • ------ file1
  • ------ fi LE2
  • -/pubblico
  • ---- filex

Abbiamo sperimentato con i seguenti approcci, ognuno con le proprie avvertimenti:

  1. Tutte le applicazioni in un unico repository. Questo è meno che ideale in quanto diventa un incubo gestendo le versioni per ogni applicazione in modo efficace (specialmente in SVN). Branching e tagging accettano file da applicazioni non correlate e separate.
  2. Tutte le applicazioni in un repository separato. Anche questo non è l'ideale (beh, è ​​dal punto di vista gestionale/organizzativo) perché non è possibile esportare due repository separati in una singola cartella, quindi si lavora sempre con un checkout di un repository e un'esportazione di altri. Se si sta lavorando sull'applicazione X e sono presenti modifiche nella nostra applicazione principale, è necessario eseguire manualmente una nuova esportazione di tale applicazione master e copiare i file nell'archivio X dell'applicazione su cui si sta lavorando per disporre del codice framework più recente.

C'è un modo con git o SVN (o qualsiasi altro sistema di controllo di versione per quella materia) per consentire più di un repository all'interno di una singola directory senza utilizzare sottodirectory? Gli esterni di SVN sono quasi perfetti, ma hanno il requisito che tutti i file nel repository esterno si trovino in una sottocartella separata, che come descritto sopra non funziona per noi. Capisco che Git ha capacità equivalenti, ma ancora una volta non può consentire più di un repository in una singola cartella, lasciandoci con lo stesso problema.

domande correlate: Multiple repositories in one directory (same level) - is it possible? - questo è molto vicino a quello che sto chiedendo che penso, ma non ho visto qualsiasi soluzione che ho sentito potrebbe essere applicata alla nostra situazione.

+0

con git, si fa di solito che tipo di materiale con le diramazioni Ogni sviluppatore può avere uno o ciascun sottomodulo o qualsiasi combinazione a cui pensare: quando senti di essere pronto a unire il ramo con il ramo principale (o qualsiasi altro), lo fai. – Timo

+0

Per essere più precisi : Puoi avere un ramo per l'app principale e definire i rami del modulo in base a questo: ereditano la struttura della directory, ma qualunque cosa tu abbia messo in essi, rimane lì. Lo svantaggio è che non puoi lavorare con più rami contemporaneamente: devi li controlli individualmente, ma in effetti tutto sarà in una directory e potrai spostare le cose da un ramo all'altro facilmente. – Timo

+0

+1 per passare a git. O almeno considerandolo. –

risposta

2

Subversion 1.6 e 1.7 consentono l'esterno di un singolo file.

Vedi http://svnbook.red-bean.com/en/1.7/svn.advanced.externals.html

"Subversion 1.6 il supporto anche introdotto per le definizioni esterne per file. File esterni sono configurati come esterni per directory e appaiono come un file di versione nella copia di lavoro.

Ad esempio, supponiamo che tu abbia il file/trunk/bikehed/blu.html in il repository, e si voleva questo file, come si presentava nella revisione 40, ad apparire nella vostra copia di lavoro del/trunk/www/come green.html."

+0

Questo è stato quasi perfetto. Tranne il fatto che puoi utilizzare solo file esterni SVN all'interno dello stesso repository. Il nostro obiettivo era avere un repository per applicazione - se avremo tutti i file in un repository, non avremmo questo problema di riferimento esterno in primo luogo. – bfarber

+0

Ok, in definitiva ciò che ho scelto di fare per semplicità ora è (1) spostare le nostre applicazioni di addon nella cartella delle filiali dell'applicazione principale (rami/app1/trunk, rami/app2/trunk, ecc.). Possiamo quindi eseguire la versione di tali app (diramazioni/app1/1_2_x) e possiamo utilizzare gli esterni SVN per estrarre i file nella cartella trunk dell'applicazione principale poiché ora sono tecnicamente nello stesso repository. Questo funziona perfettamente. – bfarber

+0

Felice che tu l'abbia capito! Grazie per aver condiviso la tua soluzione finale. – lvmisooners

3

non ho mai cercato di fare qualcosa di simile in un ambiente di produzione, ma si potrebbe certamente fare:

 
$ git init 
$ mv .git .git1 
$ git init 
$ mv .git .git2 
$ export GIT_DIR=.git1 
# do work in first repo 
$ export GIT_DIR=.git2 
# do work in second repo 
+0

Purtroppo, non essendo troppo familiare con git questo è un po 'al di sopra della mia comprensione (non è colpa tua). Ho visto suggerimenti simili online e, se/quando ci trasferiremo a git, lo rivisiterò. Grazie. – bfarber

+0

Tutte le informazioni che git utilizza per tenere traccia di un repository sono memorizzate in una singola directory. Tale directory è denominata in GIT_DIR. Cambiando GIT_DIR, cambi repository, mantenendo la stessa directory di lavoro. –

+0

Penso di ottenere ciò che i comandi precedenti fanno. Abbiamo deciso di non provare Git (il tempo lavora sempre contro di noi ovviamente), ma lo rivisiterò in futuro. Grazie! – bfarber

3

git permette di specificare il lavoro-directory e git-directory sul comando di livello superiore git:

git status 

può essere alterato per utilizzare una cartella diversa .git con

git --git-dir=some/other/path/to/a/different/.git/folder status 

Allo stesso modo, è possibile specificare una diversa cartella di lavoro:

git --work-tree=some/other/path status 

È anche possibile combinare il 2.

Se è necessario disporre di questo flusso di lavoro per tutto il tempo, è possibile ignorare e avvolgere il comando git per sempre puntare a una specifica cartella .git o alla directory di lavoro. Un esempio è "git achievements" che intercetta i comandi git e ti dà ricompense per migliorare con git e poi chiama il comando git attuale: https://github.com/icefox/git-achievements

Sembra un problema divertente da risolvere.

Vorrei anche solo avere un ramo per applicazione e ricollocare continuamente quei rami sopra ogni lavoro che viene fatto all'app principale. Questa sarebbe in realtà la mia prima scelta.

+0

Non si ha familiarità eccessiva con git e come viene utilizzato nella pratica (rispetto a SVN o CVS, dove le cose sono centralizzate), dovrò leggere un po 'di più su come questo scenario è più comunemente affrontato con git. Osserverò il suggerimento ramificato, grazie. – bfarber

+0

La semplicità di Git ti sconcerta :) studia la cartella .git e la sua struttura. Incredibilmente semplice dopo averlo capito. –

+0

Abbiamo optato, per motivi di tempo, per non provare a provare git. Tutti sono familiari e configurati con SVN e non tutti amano entrare nel merito di questo genere di cose, quindi è una transizione che dovremo pianificare meglio se decidiamo di seguire questa strada. Grazie per i suggerimenti però - lo rivisiterò in futuro se diamo un git a un colpo. – bfarber

Problemi correlati