Come posso dividere un repository che contiene molti progetti che condividono lo stesso sistema di build?

4

Ho lavorato negli ultimi anni a una suite di compilatori di ricerca, che crea diversi eseguibili e librerie. Ha un sistema di build (cioè bootstrapper ) che guarda nella directory ./src/bin alla ricerca di strumenti da compilare, e su ./src/lib , ./src/rtl e ./src/std per le librerie, gestendo le dipendenze (solo interno dipendenze!). Funziona praticamente come un singolo makefile per più strumenti (come fa GCC). Per questo motivo condividono la stessa base di codice . Finora ho utilizzato un singolo repository git.

Poiché la maggior parte degli strumenti e delle librerie sono autosufficienti, mi piacerebbe dividere il repository in diversi moduli, poiché la maggior parte degli strumenti non dipendono l'uno dall'altro (non esistono affatto dipendenze cicliche, solo un paio di quelle gerarchiche) !).

Ad esempio, avrei un modulo core con il sistema di base, che sarebbe simile a questo:

./README
./src/bootstrapper.krc
./src/bin/cpp.c
./src/bin/cc.c
./src/lib/cpp/...
./src/lib/cc/...
./src/lib/foo/...
./src/lib/bar/...

Che contiene il costruttore, e che è autonomo; dovrebbe generare cpp , cc e libcpp , libcc , libfoo e libbar librerie.

Mi piacerebbe quindi avere, ad esempio, un modulo ruby separato in qualche modo, che sarebbe simile a qualcosa:

./src/bin/rbc.c
./src/lib/rbc/...
./src/std/ruby/...

Che creerebbe rbc , librbc e libstdruby ... e poi un modulo python come:

./src/bin/pyc.c
./src/lib/pyc/...
./src/std/python/...

Quale creerebbe pyc , libpyc e libstdpython .

Sebbene entrambi i moduli ipotetici ruby e python dipendano dal modulo core , non hanno alcuna dipendenza l'uno dall'altro (ed è per questo che sto pensando di suddividere il mio attuale repository).

In quale modo potrei ottenere questo? Ho pensato di utilizzare diversi rami git per ogni modulo (ma avrei bisogno di diversi hook per rebase automaticamente tutto in base alle loro dipendenze, come avere più copie del modulo core e tenerli aggiornati), più repository git (stesso problema ), e i sottomoduli git non sono d'aiuto perché avrei bisogno di una base per file a causa del sistema di compilazione che ho ...

(Anche se preferisco git, perché mi piacerebbe pubblicarlo su GitHub, non mi importa passare a un altro SCM.)

Tutti gli strumenti ( bin/example ) dipendono dallo stesso ./include/bin/main.h (che sarebbe parte del modulo core ) che ha molte macro ... ogni cartella su ./src/ ha effettivamente un% co_de corrispondente % cartella troppo (es. ./include/ ).

Ecco una foto di qualcosa che ho descritto sopra, come è attualmente:

    
posta paulotorrens 30.05.2015 - 01:03
fonte

1 risposta

1

I requisiti
I seguenti punti sono importanti da considerare quando si pensa di dividere il repository.

  1. Ogni nuova divisione ha ora il proprio bagagliaio. Ogni prodotto non può essere un altro ramo in questo caso, perché ora ognuno di questi prodotti avrà le proprie versioni (tag), i propri rami dev e, quindi, tutti devono avere i propri tronchi, rispettivamente.

  2. Mantieni la cronologia Questa è forse la cosa più importante quando si divide il repository. Non dovremmo perdere la storia delle cose interagite in passato. Ad esempio, puoi esportare completamente fuori dall'origine e creare quattro nuovi repository. Ma tutto questo perderà la storia. Quindi ogni parte del repository del prodotto dovrebbe avere la sua cronologia quando la usiamo ora dal repository indipendente.

  3. Apri rami di lavoro Se ci sono filiali di funzionalità o filiali di supporto, e se vogliamo chiudere i negozi, dovremo chiudere tutto e rimetterlo nel bagagliaio. Tuttavia, per qualsiasi progetto di dimensioni ragionevoli questo è difficile da concretizzare. Piuttosto, i rami con la stessa cronologia e le stesse istantanee dovrebbero essere disponibili nel nuovo repository in modo che il lavoro possa riprendere da dove è stato sospeso, non è necessario riavviare!

Ma la soluzione può essere semplice:

  1. Il primo passo è quello di clonare ogni repository con un nome diverso. La procedura per ciascun tipo di repository è elencata di seguito. Fondamentalmente con quattro cloni ora hai quattro repository, ognuno con la stessa identica struttura (tronco / tag / rami), la stessa storia e lo stesso insieme di rami.

  2. Ora, dal trunk principale puoi semplicemente cancellare tutti i codici sorgente che non richiedono nel repository corrispondente. Ad esempio in un repository eliminare tutti i file ruby e mantenere solo i file C. dove si fa il contrario nell'altro repo. Così ora avrai un repository con la libreria prodotta dai file C e un'altra con i file ruby.

  3. Unisci questa modifica a tutti i rami subordinati per riflettere anche l'eliminazione da lì.

  4. Modifica i file comuni come Makefile ecc. che ora avranno la stessa struttura.

  5. È possibile che si desideri "spostare" i file per riorganizzare la struttura.

  6. Contrassegna la nuova versione con la nuova serie di numeri 2.0 (se prima era 1.x).

In seguito, tutta la cronologia rimarrà disponibile per ciascuno dei quattro repository di prodotti. E quindi, in modo critico, sarai in grado di tornare all'istantanea che ha funzionato insieme.

Cose specifiche per Repo

  1. SVN per SVN è estremamente semplice. Basta copiare incollare la cartella principale in cui è ospitato il repository. Quello che è stato generato con il comando svnadmin --create (non la copia di lavoro). Consulta il libro SVN Ch 5 per ulteriori dettagli. Una volta che lo hai clonato, ha tutto ciò che l'altro repo ha.

  2. I repository
  3. Git sono decentralizzati per impostazione predefinita. Quindi ogni volta che fai git-clone lì stesso in realtà stai clonando i repository. Tuttavia, per essere identificati con prodotti diversi hai 2 altre opzioni. A. Forking e B. Mirroring. Consulta questa pagina per la duplicazione senza mirroring . Un altro riferimento è questa domanda SO . La forchetta è un'altra opzione. Fai riferimento a questa pagina per i concetti di base. Tuttavia, la biforcazione non è esattamente la stessa della clonazione / mirroring. Preferirei il mirroring.

risposta data 12.07.2015 - 20:07
fonte

Leggi altre domande sui tag