Il comando Git e la sua integrazione con Github
Prefazione
Immaginate di dover scrivere un breve programma in java che vi restituisca a video il vostro nome. Peserà a mala pena 15KB e vi occuperà lo spazio di un file in estensione .java in una cartellina remota (uhm termine inappropriato per questa parte della guida, diciamo sperduta) del vostro pc. Spostarla da un pc ad un altro vi costerà in termini di tempo, più nel prendere fisicamente la pen drive che nello spostamento in sé. Ora, immaginate di avere il file su una cartella locale in file sharing (tipo una cartella su DropBox) e che sullo stesso ci lavoraste su in due persone da due pc diversi: data la minutezza del file e la semplicità di esso, non avreste problemi a coordinarvi per sapere cosa modificare e quando modificare, in modo da non accalcarvi in due sullo stesso punto del progetto e non sovrascrivere eventuali cambiamenti fatti da una o dall'altra parte.
Ma ciò è possibile su un piccolo file da 15KB. Ecco, ora immaginate di lavorare su una build di una ROM android, quindi con dei sorgenti da 12GB con una miriade di file che constano in una miriade di righe di codice e siete un team che sta modificando il framework dei settings. Ad un certo momento, in 4 persone (i membri del vostro team) decidete di salvare e non sapevate di lavorare sullo stesso file. I cambiamenti fatti verranno sovrascritti dall'ultimo che salva il file, facendo perdere il lavoro fatto dagli altri fino a quel momento, che può constare di qualche riga di codice, ma che può constare anche di diverse centinaia di righe!
Avreste perso un corposo lavoro e, soprattutto la sanità mentale del membro al quale avete cancellato il lavoro!
A cosa serve questo preambolo? No, non è un delirio, è il concetto di fondo sul quale si basa Github ed il comando sul quale è basato Github stesso, ossia Git!
Due righe di riferimento storico su Git è necessario spenderle, visto che è stato creato dal padre del kernel Linux stesso, Linus Torvalds a creare questo utilissimo comando. Git è un sistema di controllo di versione, direttamente usabile da riga di comando (ossia usando il vostro terminale) e permette di tenere degli "snapshots" del vostro lavoro, in modo da tornare tranquillamente indietro (nel caso quel che avete fatto è solo un abominio di programmazione o, per dire, se capite che non sia utile ciò a cui avete lavorato). Inoltre, citando l'esempio fatto prima sul piccolo programma in java condiviso, è possibile lavorare in due (o più) sullo stesso file su locale e, una volta uploadato, git tiene in conto entrambe (o più) le versioni del file e fa decidere all'utente se e quando unirli (merge) e se e quando scartarli (discard).
Prima di addentrarci nel mondo dei comandi git, è necessario introdurre un concetto fondamentale, il concetto di commit: il commit è, appunto, lo snapshot o, per dirla in maniera videoludica, il checkpoint dove arrivate e salvate, per poi tornate indietro in caso di errore/perdita di dati/sovrapposizione di scrittura. In pratica è quel che rende git il grandioso strumento che è!
Parimenti, introduciamo github. Sebbene ne abbiamo ampiamente parlato nei precedenti step della guida, adesso ne approfondiamo la conoscenza perché sarà un altro dei nostri grandi alleati nella conquista delle capacità di buildare una ROM.
Github è un social network (avete letto bene) dove è possibile uploadare il proprio codice sorgente (in pienissimo spirito open source), mostrarlo al pubblico, seguire e farsi seguire da altri developer. È controllato da git per l'integrazione del codice e quindi, riprendendo l'esempio del team che lavora su una ROM, posto che 4 persone lavorano sullo stesso file sulla copia locale dei sorgenti (scaricata mediante il comando repo sync, ricordate?), è possibile salvare uno snapshot attraverso il comando git commit, uploadare i file e tenere 4 copie del file stesso che poi si deciderà se fargli eseguire il merge o cancellare/modificare qualcosa.
Premettiamo un concetto che può sembrare banale, ma che in realtà non lo è per chi non è avvezzo di programmazione e simili. Github è un grandioso strumento perché contiene il codice sorgente di programmi/sistemi operativi/kernel ed in generale tutto software. Cosa significa? Avere il codice sorgente non significa avere il software già bello "assemblato" (perdonate il termine), ma solo i "pezzi" ed è da costruire. Noi possiamo assemblare il software, ma possiamo anche cambiarlo, modificarlo, ridurlo, aumentarlo, possiamo farci tutto quello che vogliamo. Discorso contrario se avessimo solo e soltanto il software già bello che costruito. In questo caso non potremo farci nulla, solo eseguirlo, senza poter vedere com'è fatto dentro, senza sapere il funzionamento. Esistono dei tool per decompilare ma non sono sempre estremamente precisi e comunque, funzionano (quando funzionano) su software semplici.
Quindi, cosa fa Github? Vi mette a disposizione i pezzi del vostro puzzle (i sorgenti, come quelli che abbiamo scaricato come prova per la rom), ma sta a voi metterli insieme!
Iscriversi non è molto diverso da come fareste per qualsiasi social network, Facebook, Google+ o Twitter che sia, ma richiede qualche passo aggiuntivo mediante il vostro beneamato strumento, chiamato terminale.
Iscrizione a Github
Recatevi nella home di github ed avrete questa schermata davanti

Non sto a spiegarvi come compilare i campi ovviamente.
Successivamente, aprite il vostro fidato terminale ed installiamo git (lo abbiamo già fatto seguendo la prima parte di questa maxiguida, ma per chi si imbattesse qui ed è solo interessato a github, ecco):
codice:
sudo apt-get install git
Configuriamo git con l'email usata per registrarci:
codice:
git config --global user.name "Vostro nome"
git config --global user.email "vostraemail@vostraemail.com"
Creiamo una keygen che ci servirà da firma digitale:
codice:
ssh-keygen -t rsa -C "vostraemail@vostraemail.com"
Vi chiederà di inserire una passphrase, questa dovrete deciderla voi e cercate di tenerla in mente (o comunque segnatevela da qualche parte).
Il responso del terminale sarà qualcosa del genere:
codice:
# Your identification has been saved in /c/Users/you/.ssh/id_rsa.
# Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.
# The key fingerprint is:
# 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db vostraemail@youremail.com
Adesso da terminale digitate:
codice:
cd ~/.ssh && gedit id_rsa.pub
Questo comando vi porterà nella cartella nascosta .ssh e aprirà con gedit il file id_rsa.pub. Lasciatelo aperto e recatevi su https://github.com/settings/ssh, cliccate su Add SSH key:

Tornate sul vostro gedit e copiate il contenuto del file, incollandolo nella casella in basso:

Da terminale controllache che funzioni tutto digitando:
codice:
ssh -T git@ssh.github.com
Vi richiederà la vostra passphrase secondo la chiave id_rsa.pub che avete inserito prima. Se non riuscite ad accedere via ssh, da terminale digitate:
codice:
gedit ~/.ssh/config
Ed inserite il seguente testo nel file che vi si aprirà
codice:
Host github.com
Hostname ssh.github.com
Port 443
Salvate ed uscite.
Da terminale testate se riuscite ad accedere digitando:
codice:
ssh -T -p 443 git@ssh.github.com
Dovreste visualizzare qualcosa del genere:
codice:
# Hi vostronome! You've successfully authenticated, but GitHub does not
# provide shell access.
Avete configurato Github!
Work in progress...