Il problema
Scrivo un sacco di codice esplorativo nella mia ricerca. Mentre procedo, inserisco funzionalità che mi piacerebbe riutilizzare in una posizione centrale. Un progetto potrebbe assomigliare a questo:
./mylib
./exploration
/experiment_1
/experiment_2
/experiment_3
Dove ogni esperimento utilizza alcune funzionalità da mylib
.
Ora vengo e inizio il mio quarto esperimento. Nel processo, potrei aver bisogno di cambiare la mia libreria in qualche modo incompatibile all'indietro. Ora non riesco a rieseguire i miei primi tre esperimenti senza aggiornare i loro codici per essere compatibili con la nuova libreria.
Nota : A partire da ora, manterrò mylib
nel controllo versione e exploration
nel controllo versione, utilizzando git. Ciò significa che tutti gli esperimenti si trovano nello stesso repository. Questo è fatto in modo che un singolo push
o fetch
e merge
in experiments
sincronizzi tutti i miei esperimenti tra computer. Sento che potrebbe esserci un modo migliore, ma potrebbe essere per un'altra domanda ...
Possibili soluzioni
- Potrei mordere il proiettile e aggiornare manualmente i vecchi esperimenti ogni volta che ho bisogno di eseguirli (male, noioso, ma semplice).
- Potrei "vendorizzare" la mia libreria copiandola ogni volta che faccio un nuovo esperimento. (Cattivo, i bugfix devono essere inseriti in ogni copia).
- Dato che mantengo la mia libreria nel controllo della versione, potrei taggare i punti nella cronologia della libreria con qualsiasi cosa sia richiesta da un esperimento. Quando voglio eseguire l'esperimento n , eseguo il checkout del tag n . (Meglio, ma se volessi eseguire due esperimenti contemporaneamente? Sembra anche che ci dovrebbe essere un modo per utilizzare automaticamente una versione specifica della libreria.)
- Ogni volta che avvio un esperimento, creerò un nuovo ramo nella libreria. In ogni cartella dell'esperimento, clonerò il repository della libreria e verificherò il ramo corretto. (Questo sembra ragionevole, anche se forse è uno spreco di spazio, dal momento che ho duplicato tutti i rami durante la clonazione. Inoltre, potrei avere molti esperimenti, il che significa che ci saranno un sacco di rami nel mio repository, cose ingombranti inutilmente.)
Devo riconsiderare una di queste soluzioni sopra?
Ho anche ascoltato sui sottotitoli e sottomodelli di git, e mentre loro suonano come potrebbero essere la risposta al mio problema, voglio ottenere l'input di più esperto programmatori prima di affondare il tempo in una tana del coniglio.