Newsgroup: it.comp.os.linux.sys
Titolo: git: magia nera o stregoneria?

Ma.. come diavolo fa?
# git init
# echo "Ciao" > prova
# git add prova
# git commit
# git branch experimental
# echo "SPERIMENTALE" >> prova
# git commit -a
Creo il progetto, creo un file, faccio il commit poi passo a 
experimental, modifico il file e faccio il suo commit.
I branch ovviamente differiscono.
Ma qualcuno mi puï¿œ spiegare perchï¿œ:
# cat prova
mi spara fuori
Ciao
SPERIMENTALE
e poi se faccio
# git checkout master
# cat prova
ottengo solo
Ciao
?
Come fa ad interfacciarsi con i comandi di sistema?
Se io cambio il branch, anche tutti i file mi vengono migrati
di branch? Intendo proprio i file fisici, ad esempio un banale
cat restituirï¿œ sempre il contenuto del file nel branch in cui
sto lavorando.  Ma come ï¿œ possibile?

 Ma.. come diavolo fa?
se hai voglia di leggere:
http://www.kernel.org/pub/software/scm/git/docs/user-manual.html
http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#git-concepts
saluti ...
P.S. git lo considero stupefacente anche io ! vedi branch, stash & co.
-- 
Never try to teach a pig to sing.
It wastes your time and annoys the pig.

 sto lavorando.  Ma come è possibile?
Non è che si interfaccia con i comandi di sistema, semplicemente
cambia il contenuto del file.
In .git ci sono tutti i contenuti possibili, non so come funzioni di
preciso ma utilizzerà il sistema migliore per passare da un contenuto
all'altro, di sicuro NON interferisce con il funzionamento di cat..

 all'altro, di sicuro NON interferisce con il funzionamento di cat..
Come immaginavo, ma supponendo di avere un progetto di dimensioni
enormi, con file giganteschi, quando passi da un branch ad un altro
impiegherebbe ore e spostarne il contenuto.
Con degli hardlink sarebbe sicuramente pi� svelto, il contenuto in
se per se resta dentro .git e fuori ci vanno a finire gli hardlink
del branch che hai attualmente attivo, ma non fa hardlink, copia
proprio il file...

 impiegherebbe ore e spostarne il contenuto.
[...] refuse the temptation to guess
-- Tim Peters, The Zen of python
hai provato con un progetto vero?
-- 
By ZeD

 hai provato con un progetto vero?
Si, non si nota alcun delay.
E' chiaro che la mia frase era una forzatura voluta.
Con progetti 'standard' non ci sarebbe alcun problema,
ma se io volessi trattare, ad esempio, lo sviluppo di un
video con file da centinaia di giga, o pi� semplicemente
alcuni progetti grafici con file da decine di giga, git
potrebbe essere un mattone... (� giusto una mia curiosit�)

 potrebbe essere un mattone... (è giusto una mia curiosità)
No, sinceramente staresti usando lo strumento sbagliato.
Un (d)cvs va bene per un certo tipo di lavoro: essenzialmente file di
testo (cioè i sorgenti). Per gestire il revisioning per dei file binari
di grosse dimensioni git/mercurial/altro-scm è la scelta sbagliata.
git tiene copia di ogni file/revisione, mercurial tende a fare tenere
traccia le differenze (e gli altri una qualunque variante di queste due
tecniche), quindi fai presto a capire che fino a che i binari sono
'piccoli' si riescono a gestire decentemente, ma se crescono non si
gestiscono più decentemente.
Non so con git, ma con mercurial ci sono delle estensioni (almeno un
paio) che aiutano la gestione dei binari di grosse dimensioni.
PS: sicuro di 'file di decine di giga'? che li mi sa che siamo ancora
oltre ai file di grandi dimensioni :D

 oltre ai file di grandi dimensioni :D
Be, il mio era un esempio.
Io dovrò gestire sotto VCS file PHP/HTML per cui non è il mio caso.
Ma i grafici, ad esempio, hanno quotidianamente progetti da 10-15 gb,
con tutti i sorgenti, PSD, TIFF e altre cose ad alta risoluzione, per
non parlare dei video da montare, che superano i 100gb (tra tutto,
ovvero i vari tagli, i singoli spezzoni di video, il progetto, e
quant'altro).
Ma ripeto, non è il mio caso, quella roba non va sotto VCS. Era una
semplice curiosità.

 semplice curiosità.
E' una domanda abbastanza ricorrente e c'è poco da fare, anche per quei
tipi di file farebbe comodo un "versioning" ma deve essere gestito dal
programma stesso, oppure da un programma che gestisca le differenze di
file binari.
Ad esempio io uso 
http://rdiff-backup.nongnu.org/
ma non so come si comporti con file veramente enormi.

 impiegherebbe ore e spostarne il contenuto.
Tieni conto che git è utilizzato per gestire progetti come il kernel
linux
(che giusto per darti un'idea, conta 52 mega di sorgenti tarbzippati,
oltre duecento mega se estratti) oppure Gnome.
Quindi una miriade di patches e rami di sviluppo (vuoi un esempio?
http://git.kernel.org
 ).
Tutto applicato in *secondi*, neanche minuti.
Enjoy =)
Elric W.

 oltre duecento mega se estratti) oppure Gnome.
Io parlavo di *UN* file da 2 GB, non di un progetto da 2GB.

 Io parlavo di *UN* file da 2 GB, non di un progetto da 2GB.
in quel caso:
git non è la risposta
hg non è la risposta
bazaar non è la risposta
darcs non è la risposta
svn non è la risposta
cvs non è la risposta
etc
:D