17
packz Servono kTln2 joules di energia per trasmettere un bit di informazione in un ambiente a temperatura T Git Published on 06/03,2007 [ATTENZIONE: pagina in via di completamento] Git è un programma distribuito per il controllo di "revisione" (maledetti termini inglesi[1][2]) di progetti software creato da Linus Torvalds per gestire lo sviluppo del kernel ormai giunto ad un numero di righe di codice probabilmente insostenibile per una persona normale. Il progetto partì il 3 Aprile 2005 e già nel giugno dello stesso anno il kernel incominciò ad essere gestito attraverso questo fantastico strumento. Visto l'odio viscerale che il caro nostro amico (?) nutre per il sistema alternativo chiamato CVS (vedere video) e altri sistemi analoghi, ha deciso di scriverne uno lui stesso. Qui di seguito presenterò Git nella maniera in cui l'ho imparato: non-linearmente, per attività pratiche; i comandi non direttamente sperimentati avranno un link ad una possibile documentazione specifica. Caratteristiche Supporto per lo sviluppo non lineare attraverso "branching" e "merging" e supporto per la visualizzazione della loro storia. Sviluppo distribuito: ognuno ha la propria copia locale sulla quale può fare tutte le modifiche di cui sente il bisogno per poi poterle pubblicare ed eventualmente gli amministratori del progetto potranno fare il merge da quel repository. Facilità di pubblicazione remota attraverso un protocollo apposito (git:// appunto) anche se accessibile anche rispetto ai più tradizionali http, ftp, ssh etc... Utilizzo della crittografia per la gestione della storia e dei "commit". Installazione Per installarlo su un sistema debian-like ai necessitano dei seguenti pacchetti git-core git-doc (se desideri avere la documentazione in file:///usr/share/doc/git-doc/index.html ) gitk (se si desidera visualizzare graficamente gli sviluppi) git-daemon-run (se si desidera rendere disponibile tramite protocollo git gli sviluppi) git-completion (se si desidera avere il completamento dei comandi da linea di comando) git-email (per le funzioni legatate al mandare patch via email) git-gui (interfaccia spartana per le operazioni di base) packz | Git http://packz.noblogs.org/post/2007/06/03/git 1 di 17 16/11/2008 22:56

Git

  • Upload
    mods

  • View
    601

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Git

packz

Servono kTln2 joules d i energia p er trasmettere un bit d i informazione in un am biente a temp eratura T

GitP ublished on 06/ 03,2007

[ATTENZI ONE : pa gina in via di comple ta mento]

Git è un programma distribuito per i l controllo di "revisione" (maledetti termini inglesi[1][2]) di

progetti software creato da L inus Torvalds per gestire lo sviluppo del kernel ormai giunto ad un numero

di righe di codice probabilmente insostenibile per una persona normale. Il progetto partì i l 3 Aprile 2005

e già nel giugno dello stesso anno i l kernel incominciò ad essere gestito attraverso questo fantastico

strumento. Visto l 'odio viscerale che i l caro nostro amico (?) nutre per i l sistema alternativo chiamato

CVS (vedere video) e altri sistemi analoghi, ha deciso di scriverne uno lui stesso.

Qui di seguito presenterò Git nella maniera in cui l 'ho imparato: non- linearmente, per attività pratiche; i

comandi non direttamente sperimentati avranno un l ink ad una possibile documentazione specif ica.

Caratteristiche

Supporto per lo sviluppo non l ineare attraverso "branching" e "merging" e supporto per la

visualizzazione della loro storia.

Sviluppo distribuito: ognuno ha la propria copia locale sulla quale può fare tutte le modif iche di cui

sente i l bisogno per poi poterle pubblicare ed eventualmente gli amministratori del progetto

potranno fare i l merge da quel repository.

Fac il ità di pubblicazione remota attraverso un protocollo apposito (git:// appunto) anche se

accessibile anche rispetto ai più tradizionali http, f tp, ssh etc ...

Util izzo della crittograf ia per la gestione della storia e dei "commit".

Installazione

Per installarlo su un sistema debian- like ai necessitano dei seguenti pacchetti

git-core

git-doc (se desideri avere la documentazione in f i le:///usr/share/doc/git-doc/index.html)

gitk (se si desidera visualizzare graf icamente gli sviluppi)

git-daemon-run (se si desidera rendere disponibile tramite protocollo git gli sviluppi)

git-completion (se si desidera avere i l completamento dei comandi da l inea di comando)

git-email (per le funzioni legatate al mandare patch via email)

git-gui (interfacc ia spartana per le operazioni di base)

packz | Git http://packz.noblogs.org/post/2007/06/03/git

1 di 17 16/11/2008 22:56

Page 2: Git

git-buildpackage (permette di importare pacchetti sorgenti come repository di git)

Fare attenzione che la versione nei pacchetti dif ferisce molto da una distribuzione ad un'altra causa

l' incessante attività degli hacker che lavorano sopra Git (sono iscritto al la ml e mi arrivano c irca 50 mail

al giorno quando stanno tranquil l i).

Concetti

Git basa i l suo design sull ' idea che non c 'è uno sviluppatore migliore degli altri: non vi è la necessità

che esista un repository princ ipale a cui tutti debbano riferirsi, ma permette anzi uno sviluppo

distribuito, dove ognuno può, una volta che ha scaricato i l codice, apporre delle modif iche e ripubblicare

a sua volta i l codice permettendo modif iche ulteriori;

Al contrario di altri programmi di questo tipo, lui non elabora f i le, ma i contenuti dei f i le, L inus stesso lo

descrive come content-addressable; contiene due strutture dati

Un indice mutevole che raccoglie le info sulla directory di lavoro corrente e sulla versione

successiva che verrà importata.

1.

Database di oggetti (immutabile).2.

In particolare esistono varie tipologie di oggetti:

Blob: semplicemente un insieme binario di dati che non si riferisce a niente altro. A basso l ivello

viene creato tramite git-update-index , mentre i l contenuto può essere visualizzato tramite

git-cat-file.

Tree: è un oggetto che lega assieme blob e/o tree; viene creato tramite git-write-tree e visualizzato

attraverso git-ls-tree

Commit: introduce i l concetto di "storia": è rappresentato dal tree risultante, dal commit

ef fettuato/i per arrivare a quel punto e dal commento a questi.

Tag:identif ica simbolicamente altri oggetti, tramite l ' identif icazione ed i l tipo dell 'oggetto

Si può riconoscere in questo schema un graf ico c ic l ico diretto.

Ognuno di essi viene denominato attraverso un Hash SHA-1 di 40 c if re esadecimali creato con i l

contenuto proprio dell 'oggetto. Questo codice può essere util izzato per riferirsi a ben determinati punti

(temporali) del progetto.

Capito come funziona a basso l ivello questo astuto programma, potete immaginare che la grandezza più

util izzata è i l tree: siccome un commit punta ad un tree ed una tag punta ad un commit, entrambi

possono essere usati indistamente. In maniera analoga una tag è simil commit quindi può essere usata

quando si richiede un commit.

Specif icando il nome di una referenza, git la cerca in una di queste directory

.git/ (or $GIT_DIR)

.git/refs/ (or $GIT_DIR/refs/)

.git/refs/heads/ (or $GIT_DIR/refs/heads/)

.git/refs/tags/ (or $GIT_DIR/refs/tags/)

Esistono inoltre una grammatica ben prec isa per riferirsi alle referenze: la testa del ramo corrente di

sviluppo viene indicato con HEAD (si trova in .git/HEAD) ed è un riferimento ad un elemento in .git/refs

/heads/; è possibile usare l 'operatore postf isso ^ per indicare i l genitore di una data referenza. Siccome è

possibile usarlo più volte esiste la regola che l 'applicazione ripetuta N volte di ^ può essere sostituita

con l 'operatore postf isso ~ seguito da N: c ioé

HEAD^^^ è equivalente a HEAD~3

Siccome questi riferimenti sono ovviamente legati al la situazione attuale del ramo di sviluppo, è

packz | Git http://packz.noblogs.org/post/2007/06/03/git

2 di 17 16/11/2008 22:56

Page 3: Git

possibile conoscere la referenza assoluta usando

git rev-parse REFERENZA

quindi nel caso precedente basta dare git rev-parse HEAD~3 per sapere a quale commit si riferisce. Una

descrizione più approfondita la si può trovare tramite git rev-parse --help alla sezione SPECIFYING

REVISIONS da cui potrete capire f igure quali

G H I J

\ / \ /

D E F

\ | / \

\ | / |

\|/ |

B C

\ /

\ /

A

A = = A^0

B = A^ = A^1 = A~1

C = A^2 = A^2

D = A^^ = A^1^1 = A~2

E = B^2 = A^^2

F = B^3 = A^^3

G = A^^^ = A^1^1^1 = A~3

H = D^2 = B^^2 = A^^^2 = A~2^2

I = F^ = B^3^ = A^^3^

J = F^2 = B^3^2 = A^^3^2

Getting started

Oltre a voler capire come sono implementate le funzionalità di git, magari vorrete usarlo no? no

problema, per questo esiste questa parte: cerchiamo di esplicare i comandi fondamentali e/o più uti l i ,

anche se, per un approfondimento, rimando alla documentazione uf f ic iale.

Supponiamo che abbiamo appena iniziato un nuovo progetto e che c i troviamo nella directory in cui i l

progetto stesso risiede, per inizializzare i l repository bisogna eseguire[3]

git init-db

e di seguito

git add . se si vuole importare tutto, oppure git add file_1 ... f ile_n se interessano solo c erti file

Visto che lo scopo princ ipale di questo programma è i l tracc iare i cambiamenti, una volta che si è

lavorato su un albero di sorgenti si possono controllare i cambiamenti attraverso

git status

packz | Git http://packz.noblogs.org/post/2007/06/03/git

3 di 17 16/11/2008 22:56

Page 4: Git

che rende noto i f i le modif icati ma non "committati" , i f i le che non vengono inseriti etc ..lo schema di

uti l izzo è i l seguente: via via che si fanno le modif iche e si interessa salvarle nel prossimo commit, si

aggiungono i f i le uti l i tramite git add; per ef fettuare ef fettivamente i l commit

git commit

che indic izza tutti i cambiamenti memorizzati nell ' index (bisogna scrivere i l commento ed è

consigliabile dividerlo in uno riassuntivo ed uno più esplicativo separati da una l inea vuota). Per

ricordarc i quali sono i cambiamenti che sono stati apportati f ra indice, repository e working tree viene in

aiuto i l comando git diff : normalmente questo comando restituisce la dif ferenza f ra i l working tree ed i l

repository senza tenere conto delle modif iche già inserite nell ' indice (in pratica fa un dif f f ra working

tree e indice per farla breve); per avere info a riguardo al codice inserito nell ' indice rispetto a quello del

repo si aggiunge l 'opzione --cached al comando.Altra simpatica opzione che aiuta la visualizzazione è

--color che rende di colore rosso o verde le righe rispettivamente tolte o aggiunte.

È anche possibile conf igurare git in maniera tale che inserisca in automatico i vostri dati nei commit: nel

mio caso nel f i le .git/conf ig ho inserito le righe

[user]

name = "packz"

email = "packz at autistici dot org" [ovviamente tu c he non sei un bot fai i c ambiamenti del c aso]

È evidente che è possibile inserire nuovi f i le in qualunque momento nel progetto usando sempre git add

ed è inoltre importante tenere conto del fatto che è possibile usare wildcard per scegliere f i le che

rientrano in un ben determinato schema: per esempio

git add directory_generica/*.txt

inserirà nell ' indice tutti i f i le che hanno estensione txt (la barra davanti all 'asterisco preserva quel

carattere dall ' interpretazione fatta dalla shell e nel caso di git inserisce f i le txt anche di sottodirectory).

Nel caso abbiate bisogno di eliminare un f i le dall ' indice potete usare

git rm

che appunto, si occupa dell 'operazione inversa di git add (non è proprio così). Nel caso necessitate di un

messaggio standard nei commit, è possibile impostare nella conf igurazione un f i le contenente i l

template di questo messaggio tramite i l suo path relativo alla working dir:

[commit]

template = .git/commit-template

dove ovviamente dopo template potete inserire i l percorso che volete.

Comandi utili

Git dispone di varie funzionalità che richiamano le uti l ity da riga da comando tipiche del mondo *nix e

packz | Git http://packz.noblogs.org/post/2007/06/03/git

4 di 17 16/11/2008 22:56

Page 5: Git

che permettono la gestione e la lettura del codice nel la sua evoluzione temporale e non; uno dei comandi

è git blame che permette di vedere ad ogni l inea di un dato f i le chi lo ha modif icato e quando, potendo

limitare ad un dato range di questo tramite anche espressioni regolari: per esempio

:) $ git blame -L ' /^ f unct ion generate_script _js( /,/^ }$/' private/P hp/rout ine.php

96c53bd8 ( packz 2007-06-09 16:11:57 + 0200 46) f unct ion generate_script _js( $src ) {

96c53bd8 ( packz 2007-06-09 16:11:57 + 0200 47) $js = "< script t ype= "text /javascript " src= "$src" rel= "javascript "> ";

96c53bd8 ( packz 2007-06-09 16:11:57 + 0200 48) $js .= "< /script> n";

96c53bd8 ( packz 2007-06-09 16:11:57 + 0200 49) return $js;

96c53bd8 ( packz 2007-06-09 16:11:57 + 0200 50) }

restituisce le righe delle def inizione di una funzione Php. Inoltre è capace di tracc iare l inee di codice

spostate da un f i le all 'altro passandogli l 'opzione -C (seguendo questo consiglio di Torvalds, è meglio

copiare, fare i l commit e poi modif icare quelle l inee).

Altro comando è git grep che come l'omonimo da shell cerca l 'occorrenza di una determinata stringa

nel f i le passato come argomento (nice l 'opzione --color che permette una lettura più chiara).

È possibile anche conoscere in quali commit un dato f i le è stato cambiato tramite

git whatchanged path/to/file

(senza i l nome del f i le restituisce un log con tutti i f i le modif icati).

Forse la vera potenzialità sta proprio in questa caratteristica che permette di "montare" opportunamente

i singoli comandi per ottenerne di nuovi: supponiamo di voler conoscere i l numero di l inee a cui

ammonta ogni singolo f i le del progetto, usando le funzionalità della shel l bash e i comandi di git questo è

possibile tramite i l comando

for i in $(git ls-files); do wc -l $i; done | awk '//{VAR+=$1; print $0}END{print "totale: "VAR}'

oppure è possibile conoscere i l numero di persone diverse che hanno contribuito al codice presente nel

repository (fonte)

git log --pretty=short | sed -n 's/^Author: \([^<]*\)<.*$/\1/p' | sort | uniq | wc -l

Branch&Tag

Esistono due cose fondamentali nello sviluppo del software: la possibil ità di provare nuove soluzioni e la

possibil ità di impostare a determinate conf igurazioni del codice dei nomi/versioni da poter porre come

punti fermi nello sviluppo. Questa possibil ità sono espresse da Git attraverso i branch e le tag.

Per branch si intendono delle " l inee concettuali" di sviluppo in cui suddividere i l progetto, possono

essere derivate da progetti esterni (tracking branches) oppure provenire da cambiamenti minimi dal

ramo princ ipale (topic branches). Al l ' inizio esiste solo i l branch chiamato master ma è semplic issimo

crearne di nuovi e uti l izzarli acrobaticamente passando da uno all 'altro!!!

Un semplice

git branch

packz | Git http://packz.noblogs.org/post/2007/06/03/git

5 di 17 16/11/2008 22:56

Page 6: Git

restituisce l 'elenco dei branch disponibil i , mentre per crearne uno di nome 'hazardous' si abbisogna del

magico comando

git branch hazardous

a cui sarà possibile accedere attraverso

git checkout hazardous

e fare le modif iche senza modif icare i l ramo master; riuti l izzando git branch si otterrà

master

* hazardous

con l 'asterisco ad indicare i l branch in cui si stanno ef fettuando le modif iche. Nel momento in cui c i

ritroviamo con del codice in un branch "experimental" che riteniamo oramai stabile, possiamo unirlo al

branch princ ipale tramite i l merging:

git merge ["qui un commento" master] hazardous

oppure spostarc i nel branch voluto e poi eseguire semplicemente

git merge hazardous

se non c i saranno problemi i due rami saranno uniti in uno solo e quello master conterrà i cambiamenti;

git possiede degli algoritmi per gestire la fusione di codice nello stesso f i le, ma non è detto che i l tutto

sia possibile, in questo caso nel f i le (o nei f i le) interessato/i saranno presenti delle l inee in sti le dif f con

evidenziati i problemi (appena sarò più pratico vi farò sapere). Se non pensate di ef fettuare più

cambiamenti da quel branch lo potete cancellare tramite

git branch -d hazardous

In una sola mossa è possibile anche creare e spostarsi nel nuovo branch tramite

git checkout -b hazardous

inoltre è anche possibile fare i l checkout di una versione più vecchia usando il commit come argomento

per poi aprire un nuovo branch da quel punto usando la regola appena insegnata. È anche possibile creare

dei branch "vuoti" c ioé dei rami di sviluppo senza parents: i l metodo da usare è un po' tricky e ve lo

espongo nel seguito

packz | Git http://packz.noblogs.org/post/2007/06/03/git

6 di 17 16/11/2008 22:56

Page 7: Git

$ git-symbolic-ref HEAD refs/heads/mybranch

$ git rm --cached -r .

$ rm * # questo serve quando si cambierà branch per evitare errori

$ git commit --allow-empty

è utile per creare del codice parallelo al progetto di sviluppo ma che può non interessare i normali

developer, per esempio la web page del progetto etc ...

Si può uti l izzare i l checkout per invertire i cambi local i al proprio archivio locale tramite

git checkout -f

che in pratica riporta all 'attuale ramo il contenuto della directory.

Per quanto riguarda i tag invece è ugualmente semplice la loro gestione:

git tag -l <pattern>

visualizza i tag con un nome che rispecchia i l pattern passato, mentre

git tag <label>

imposta <label> come tag della attuale versione.

Rebasing

È anche possibile che vi troviate in questa situazione

A---B---C topic

/

D---E---F---G master

e vogliate aggiornare il branch topic con master in modo da ottenere la situazione

A'--B'--C' topic

/

D---E---F---G master

senza dover fare un branch temporaneo e spostare le patch per ricreare la situazione: vi viene in aiuto

git rebase! basta in questo caso dare

git rebase master topic

packz | Git http://packz.noblogs.org/post/2007/06/03/git

7 di 17 16/11/2008 22:56

Page 8: Git

che passa al branch topic ed ef fettua appunto i l rebasing; nel caso foste già in topic so potrebbe togliere

l'ultimo argomento.Questo comando è molto potente in quanto permette di modif icare i singoli commit

fondendoli o dividendoli all 'occorrenza per sopperire a qualsiasi necessità. Nel caso c i siano dei problemi

è possibile annullare l 'operazione tramite

git rebase --abort

Esiste anche una versione interattiva di questo comando nelle ultimissime versioni a cui si accede

(sorpresa) con

git rebase --interactive

Errare humanum est

Può capitare di sbagliare ed infatti ecco qualche comando utile per invertire l 'errore

git checkout FILE -

git reset - dimentica nuovi f i le aggiunti

git reset --hard - tralasc ia i cambiamenti

git reset --soft HEAD^ - cancella l 'ultimo commit ma lasc ia i cambiamenti

git checkout -m branch_corretto nel caso si sia iniziato a fare cambiamenti nel branch errato

Bisecare i bug

Succede appunto di sbagliare durante la produzione del codice, ma magari ce ne accorgiamo (molto) in

seguito,magari qualcun'altro che i l risultato del nostro lavoro lo usa in maniera dif ferente e nel

f rattempo sono stati pushati svariati commit nel repository e non possiamo sapere direttamente quale

commit in particolare ha introdotto un baco: a questo viene aiuto i l comando git bisect che si preoccupa

di creare un branch temporaneo e di ef fettuare una operazione di dicotomia sulle parti del codice

Io personalmente non l 'ho provato ancora, ma potete trovare dalle parole del sommo il suo util izzo.

Importare un repository remoto

È importante anche poter importare da una locazione remota un progetto che c i interessa, in maniera da

apportare le modif iche da eventualmente rispedire al mittente (w l 'open source); per mettere in pratica

questo i l comando è

git clone <uri>

che crea nella directory corrente i l contenuto del repository e due branch: master e origin, di cui i l

primo, per convenzione, è preposto alle modif iche. Per aggiornare i l contenuto locale rispetto a quello

remoto è usato i l comando

git pull

(l ' indirizzo da cui proviene è nel f i le .git/remotes/origin).

Di default viene scaricato solo i l ramo master di un repository, per ottenere tutti i rami presenti eseguire

git branch -r

packz | Git http://packz.noblogs.org/post/2007/06/03/git

8 di 17 16/11/2008 22:56

Page 9: Git

che restituirà qualcosa come

origin/HEAD

origin/label_placing

origin/master

origin/menu_on_client

origin/pdf_profile

origin/xform

origin/xslt

a questo punto con un bel

git checkout --track -b local_branch_name origin/remote_branch

creerà un branch locale chiamato local_branch_name a partire dalla referenza origin/remote_branch e lo

sincronizzerà con quello remoto.

Patching

Una ulteriore chicca di questo programma è la possibi l ità di generare delle patch da spedire per posta

tramite i l comando (con l 'opzione -n e più patch speci f icate vi ritroverete con l ' intestazione della mail

nella forma "[PATCH 2/5]")

git format-patch <since>..[<until>]

A meno che non specif ichiate - -stdout vi ritroverete tutti i dif f dei vari commit per arrivare da <since>

ad <until> (se quest'ultimo non è specif icato, pone di default i l ramo attuale); si può indicare per questi

sia i l loro codice hash che i l nome del branch che una tag. Ovviamente come si possono spedire le patch,

si possono anche " leggere" ed è qui che la potenzialità svetta:

git am <mail box>

apre la mail, scarica le patch e le applica. Per <mail box> si intende il percorso alla cartella locale della

mail (nella documentazione parlano di "Berkeley mail" che dovrebbe corrispondere alla posta letta

attraverso i l pacchetto mailx in un sistema Debian); nel mio caso è /var/log/packz se qualcuno ne sa di

più batta una mail ;- )

Consiglio di usare l 'opzione --interactive così da poter scegliere le patch da applicare (una alla volta!)

altrimenti vi dà errore (se non c i sono solo patch!!!), al massimo scarivatele a parte e poi applicatelo.

Comunque a meno che non siate dei guru installatevi pine (su ubuntu c 'è alpine) altrimenti diventate

rincoglioniti ad usare mail.

Nel caso non vogliate sc lerare è possibile applicare la patch manualmente tramite i l comando

git-applymbox <file della patch>

packz | Git http://packz.noblogs.org/post/2007/06/03/git

9 di 17 16/11/2008 22:56

Page 10: Git

e vi ritroverete i l commit già inserito nel tree con i l commento preceduto da "[PATCH]" per la gioia di

grandi e picc ini.

Nel caso non vi f idiate del vostro c l ient di posta è possibile uti l izzare git send-mail per avere con

sicurezza l ' invio della patch: quindi

git send-mail --to [email protected] --subject "vattela a prendere nel culo" files

Probabilmente non avete un servet SMTP quindi vi conviene installarvene uno af f inché i l tutto funzioni

per i l meglio: dalla documentazione di git si consiglia msmtp, un semplice programma che permette di

inviare patch anche attraverso connessioni che util izzano SSL (tipo gmail oppure autistic i ;- )): per

installarlo

# apt-get install msmtp

poi creare i l f i le ~/.msmtprc con per chi usa un account su autistic i

# Example for a user configuration file

# Set default values for all following accounts.

defaults

tls on

tls_starttls off

#tls_trust_file /etc/ssl/certs/ca-certif icates.crt

tls_certcheck off

logfile ~/.msmtp.log

# My email service

account packz

host smtp.autistic i.org

port 465

from [email protected]

auth on

user [email protected]

# if not set below, msmtp ask for a password

password

# Set a default account

account default : packz

e poi inviare la mail tramite

git send-email --smtp-server /usr/bin/msmtp file_contenente_la_patch

a quel punto vi verranno chieste interattivamente gli estremi della mail e le manderà in automatico.

Troubleshooting

A me personalmente non ha funzionato subito: ecco i possibili scenari

msmtp: /home/packz/.msmtprc: must have no more than user read/write permissions

Soluzione: chmod 0600 ~/.msmtprc

msmtp: the server sent an empty reply

packz | Git http://packz.noblogs.org/post/2007/06/03/git

10 di 17 16/11/2008 22:56

Page 11: Git

Soluzione: tls_starttls off (forse non la migliore...)

msmtp: TLS certif icate verification failed: the certif icate hasn't got a known issuer

Succede siccome il server usato (come per esempio autistic i), possiede un certif icato "self signed".

Soluzione: tls_certcheck off (sicurezza portami via)[per altre info]

Per usarlo con Gmail guardate nelle GitTips. Pubblicare il codice

Magari siete proprio voi ad avere la necessità di rendere pubblico i l codice e di rendere disponibile quindi

agli altri di poter c lonare i l vostro repository; esistono vari metodi per poterlo fare

HTTP

Di seguito le azioni da compiere

1) Spostarsi nella directory padre rispetto al vostro albero dei sorgenti (che deve essere già

"gittato");

i l progetto presuppongo sia in una directory chiamata "project"

2) eseguire git clone --bare project project.git

3) copiare la directory project.git nello spazio del web server

4) spostarsi nella directory appena copiata

5) Eseguire git --bare update-server-info

6) Rendere eseguibile lo script post-update tramite chmod a+x hooks/post-update nella directory

project.git.

Nel caso poi vogliate pubblicare su questo server le nuove modif iche del codice, basta eseguire tramite

ssh i l comando

git push ssh://mio.domino/absolute/path/to/git/project.git master:master

Git by Git

È possibile ottenere git attraverso git stesso con i l comando

git clone git://git.kernel.org/pub/scm/git/git.git

Consiglio caldamente di installare la versione più "moderna", magari tenendola parallelamente a quella

della vostra distro uf f ic iale: i passaggi da compiere sono i seguenti (tutti da eseguire come utente

normale)

git pull # aggiorna il tutto

git tag # per vedere l'ultima versione stabile (oppure gitk)

git checkout vx.x.x # pone il working tree a quella versione (no -rc please)

./configure --prefix=/opt/git-vx.x.x # imposta il path di installazione in /opt/ (createla

eventualmente)

make

make install

cd /opt/

unlink git # se avete già una precedente installazione manuale

ln -s git-vx.x.x git # crea il link simbolico

Aggiornate i l PATH in ~/.bashrc nella seguente maniera

PATH=/opt/git/bin/:$PATH

packz | Git http://packz.noblogs.org/post/2007/06/03/git

11 di 17 16/11/2008 22:56

Page 12: Git

e verif icate che git --version vi restituisca i l numeril lo giusto... nel caso interessi, la documentazione va

creata a parte con make doc, installata con make install-doc ricordandosi di impostare i l percorso di man

correttamente tramite la variabile MANPATH .

Configurazione

Un programma dalle così vaste potenzialità e comandi accessori, necessità di poter essere conf igurato a

livello utente come meglio si crede: a questo scopo sono possibil i due alternative

editare a mano il f i le .git/config1.

usare i l comando git config (usando assieme l'opzione --global viene impostato per tutti i repository

locali contenuti nel computer)

2.

Una possibil ità di vasta portata è la capacità di creare degli alias, c ioé dei nuovi comandi che eseguano

comandi di git e non: per impostarli basta creare una sezione alias nel f i le di conf igurazione (ulteriori

informazioni).

Cleanup&Optimize

Dopo aver lavorato per un certo periodo di tempo su un dato repository è possibile eseguire delle

operazioni di "pulizia" per tenere ordinato i l nostro archivio e diminuire lo spazio occupato su disco dallo

stesso. Il primo comando e git repack che riscrive tutti gli oggetti presenti nella directory (.git)/objects/

in una sottodirectory (.git)/objects/pack/ in un formato particolare (in pratica in una forma deltif icata,

per ulteriori info guardate Documentation/technical/pack-format.txt nell 'albero dei sorgenti di git). Il

sommo consiglia di ef fettuare i l repacking per non avere performance scadenti sul lungo periodo.

Appena creati i f i le *.pack comunque restano in giro gli oggetti originali (che a questo punto sono

rindondanti) e servirebbe dare un bel git-prune-packed, tuttavia pare un comando di basso l ivello ed è

quindi preferibile usare i comndi più general purpouse per la pulizia.

Per la pulizia del repository è consigliabile l 'uso di git gc che si preoccupa di chiamare a sua volta git

prune, i l quale è adibito ad eliminare ogni elemento non più accessibile (tramite git fsck --unreachable),

oltre che anche git-prune-packed come accennato sopra.

Anche l'occhio vuole la sua parte

Siccome è dif f ic i le seguire gli sviluppi del software facendo solo af f idamento ai commenti dei vari

commit, è disponibile i l progetto gitk, attualmente distribuito assieme a git stesso tramite cui è possibile

visualizzare l 'evoluzione del progetto che abbiamo a cuore: tramite le parole dello stesso Torvalds

possiamo dire

gitk is really quite inc redibly c ool, and is great for visualizing what is going on in a git repository. It's

espec ially useful when you are looking at what has changed sinc e a particular version, sinc e it grac efully

handles partial trees (and this also avoids the expense of looking at _all_ c hanges in a b ig projec t) .

(commit 5569bf9bbedd63a00780fc5c110e0cfab3aa97b9 di git ;- )), ma una immagine vale più di mille

parole

packz | Git http://packz.noblogs.org/post/2007/06/03/git

12 di 17 16/11/2008 22:56

Page 13: Git

questo è come si presenta visivamente i l progetto git a c irca metà del suo sviluppo: i rami di diverso

colore sono i vari branch...

Esistono tuttavia altri programmi analoghi che tuttavia non hanno la stessa resa graf ica: tig, qgit... se

approfondirò i l loro uti l izzo lo saprete.

Quando la rete non è available

Succede che non si ha a disposizione un accesso alla rete e quindi i comandi fetch/pull/push non possono

essere usati nella loro maniera convenzionale, nonostante questo git è ancora capace di essere

pienamente funzionale attraverso i l comando git bundle.

La sintassi del comando in questione è una delle seguenti

git-bundle create <file> <git-rev-list args>

git-bundle verify <file>

git-bundle list-heads <file> [refname...]

git-bundle unbundle <file> [refname...]

La prima versione è quella uti le per creare i l bundle: <file> corrisponderà al nome del f i le risultante e

<git-rev-list args> è un qualunque argomento accettabile da git-rev- l ist (quindi oltre sha1 si possono

usare tag e identif icativi temporali come " --since=10.days.ago"). Per creare semplicemente un bundle

con tutto l 'archivio si usa

git-bundle create my-project.bundle master

Nel f rattempo che imparo meglio leggetevi questo thread.

Packaging

In una certa misura è importante poter esportare i l proprio lavoro sotto forma di archivi da poter inviare

o da scaricare comodamente anche a chi non è un developer (developer developer) e proprio per questo

è stato inventato i l comando

git archive --format=<tar|zip> [--prefix=<prefix>/] <tree-ish> [path]

Poi per chi è un amante delle distribuzioni debian-based, esiste anche un insieme di comandi pensati

per interagire con i ri lasc i tramite pacchetti, inglobati nella suite git buildpackage

git import-dsc : crea un repository git da un pacchetto debian pre-esistente.

packz | Git http://packz.noblogs.org/post/2007/06/03/git

13 di 17 16/11/2008 22:56

Page 14: Git

git import-orig: crea un repository git da sorgenti.

git buildpackage: compila e crea i l pacchetto.

git dch: aggiorna i l Changelog a partire dai commit di git.

Esistono princ ipalmente due modi per iniziare ad usarlo

Importare un pacchetto pre-esistente: facc iamo un esempio con netcat

$ apt-get source netcat

$ git import-dsc

1.

Importare un progetto non avente un pacchetto debian:supponiamo che i l progetto sia archiviato in

un f i le project-0.2.tar.gz (attenzione che l 'archivio deve contenere un pref isso altrimenti i l

comando git import-orig restituirà un errore del tipo Cannot copy files: [Errno 20] Not a directory:

'../tmpnsjU34/NOME_DI_QUALCHE_FILE')

$ mkdir project-0.2

$ cd project-0.2

$ git init

$ git import-orig -u 0.2 /path/to/project-0.2.tar.gz

2.

In generale vengono usati due branch particolari

debian-branch: contiene i l ramo di lavoro dove vengono ef fettuati i lavori nel codice

upstream-branch: contiene l codice proveniente dalla upstream release (come tradurlo in italiano?)

tuttavi nulla vieta di cambiare la topologia del repository come meglio vi aggrada.

Per ulteriori informazioni andate sulla home page: http://honk.sigxcpu.org/projects/git-buildpackage

/manual-html/gbp.html.

Contributi

Esistono tutto un insieme di piccoli programmini accessori a git che si trovano sotto la directory

/usr/share/doc/git-core/contrib/; f ra questi vi segnalo nel bash_completion la possibil ità di avere i l

prompt con indicato i l branch in cui c i si trova (nel caso ovviamente la directory corrente corrisponda ad

un repo git)tramite __git_ps1: i l suo util izzo è tramite

PS1='$(__git_ps1 "%s branch")'

ovviamente potete aggiungere sia prima che dopo robe util i a voi...

Linkografia&Documentazione

wikipedia

home page del progetto (doc)

Linus Torvalds's technical speach (video)

Pagine di manuale (man git-<comando> oppure git <comando> --help)

Everyday git

git-buildpackage (home&doc)

Mail ing l ist archive (vecchia e nuova)

Bart's Blog (git tag)

Git for computer sc ientists (spiegazione tramite graf i di come lavora git a basso l ivello)

Git cheat sheet .

altro cheat sheet.

Git guide.

GitTips.

Repo pubblico per avere hosting di progetti gestiti tramite Git.

Post con considerazioni interessanti (sopratutto sull ' index).

Footnote

1 - In inglese viene chiamato distributed revision control software conf iguration management project.

packz | Git http://packz.noblogs.org/post/2007/06/03/git

14 di 17 16/11/2008 22:56

Page 15: Git

T h i s i s the Re Ca p tcha P l ug i n fo r Li fe ty pe

2 - Git in inglese è usato come insulto per riferirsi ad uno stupido.

3 - La versione nel sistema da me usato è la 1.4.4.2, mentre nella documentazione uf f ic iale c i si riferisce

alla 1.5 o successive, quindi i comandi potrebbero essere diversi; si può scaricare la versione unstable

per debian a questo indirizzo.

Trackback URL

http://noblogs.org/trackback.php?id=11115

Leave a Reply

Name (required)

Mail (will not be published) (required)

Website

Please solve the puzzle (required)

Submit Comment

One Response to Git

Type the two words:

packz | Git http://packz.noblogs.org/post/2007/06/03/git

15 di 17 16/11/2008 22:56

Page 16: Git

packz says:

07/13,2007, at 00:07

Visit packz

Ma penso che questa situazione sia dif f ici le da gestire in quanto i l programma è stato pensatoappositamente per i sorgenti del kernel e quindi f i le di testo; io non sono un gran esperto e stoscrivendo a poco a poco le cose che imparo (tu mi sopravvaluti. . . ma grazie lo stesso per icomplimenti) e nel mio caso, quando sono presenti f i le binari ( immagini per esempio) l i tengo indirectory separate e poi le importo a parte: è meno f requente cambiare un immagine e di solito sene occupa una persona sola, io non so bene come sia i l tuo caso... se risolvi i l tuo problema o haiqualche consiglio sull 'uso di git non ti fare problemi a postarl i che l i aggiungo...

packz says:

09/27,2007, at 17:23

Visit packz

packz | Git http://packz.noblogs.org/post/2007/06/03/git

16 di 17 16/11/2008 22:56

Page 17: Git

Ho trovato questo delizioso l ink su del. icio.us su di un tipo che presenta una soluzione al tuoproblema

http://www.bluishcoder.co.nz/2007/09/git-binary-f i les-and-cherry-picking.html

fecendo uso di gitattributes (vedi http://www.kernel.org/pub/software/scm/git/docs/gitattributes.html) appena ho tempo scrivo qualcosa, magari la traduzione della pagina dimanuale... se qualcun'altro ha soluzioni si faccia avanti.

packz | Git http://packz.noblogs.org/post/2007/06/03/git

17 di 17 16/11/2008 22:56