Sto davvero cercando di capire git
, quindi ecco una riformulazione più severa di una domanda precedente che avevo chiesto. Spiegherò uno scenario ipotetico, spiegando cosa penso che succede quando scarichi del codice usando git
e lo installi su una macchina, e spero che qualcuno possa dirmi quale parte non sono corretta!
- Eseguo
git clone git://github.com/foo/foo.git
- Questo crea una directory locale
foo
e scarica il codice sorgente e i dati git - Questo codice sorgente contiene effettivamente tutte le versioni del software: file di origine, file di intestazione e dati git per le diverse versioni
- Eseguo
git checkout release-1.0
- Questo dice al mio sistema che voglio occuparmi della versione 1.0 del software
- Eseguo
make
, che compila il codice per la versione 1.0 - Crea una libreria chiamata
libfoo.so.1
- Eseguo
make install
, che installa la libreria - Copia oltre
libfoo.so.1
nella directory/usr/local/lib
- Copia anche il file di intestazione
foo.h
nella directory/usr/local/include
- Questo file di intestazione è la versione di
foo.h
che corrisponde alla versione 1.0 del software - Ora voglio installare anche la versione 2 del software, quindi eseguo
git checkout release-2.0
- Questo dice al mio sistema che voglio occuparmi della versione 2.0 del software
- Eseguo
make
, che compila il codice per la versione 2.0 - Crea una libreria chiamata
libfoo.so.2
- Eseguo
make install
, che installa la libreria - Copia oltre
libfoo.so.2
nella directory/usr/local/lib
- Copia anche il file di intestazione
foo.h
nella directory/usr/local/include
- Questo file di intestazione è la versione di
foo.h
che corrisponde alla versione 2.0 del software - Ora provo a creare un progetto che dipende dalla versione 2.0 del software e lo collego a
libfoo.so.2
che è a/usr/local/lib
, e includofoo.h
che è a/usr/local/include
- Questo progetto viene compilato ed eseguito bene
- Ora provo a creare un progetto che dipende dalla versione 1.0 del software e lo collego a
libfoo.so.1
che è a/usr/local/lib
, e includofoo.h
che è a/usr/local/include
- Questo progetto non viene compilato correttamente, perché
foo.h
è il file di intestazione per la versione 2.0 del software, non la versione 1.0.
Quindi, la cosa su cui sono sconcertato è come si possano avere due versioni di alcuni software installati sul proprio computer. I file di libreria effettivi libfoo.so.1
e libfoo.so.2
sono entrambi creati e possono essere collegati a due progetti diversi, ma sul sistema locale è installata solo una versione di foo.h
. Pertanto, solo la versione installata più recente avrà il file di intestazione corretto, poiché le due versioni richiedono versioni diverse di foo.h
.
Per favore qualcuno può spiegare dove mi sto confondendo? Grazie!