sreda, 24 aprila, 2024
Sam svoj majstor

Git (7. deo): Atributi

Autor: Zlatan Vasović

Korišćenjem Git atributa možemo podesiti način prikaza razlika prilikom korišćenja git diff komande, filter sadržaja i strategije spajanja (engl. merge).

Atribute možete podesiti u .gitattributes (uglavnom se nalazi u korenoj fascikli skladišta programskih paketa) i .git/info/attributes datotekama (ukoliko želite da sakrijete podešavanja).

Binarne datoteke

Atributi mogu poslužiti za identifikovanje binarnih datoteka i davanje instrukcija Git-u za te datoteke.

Identifikovanje

Često su neke datoteke prikazane kao tekst, iako u tom obliku nemaju smisla već su korisne samo kao binarne datoteke. Primer – *.pbxproj – deo svakog Xcode paketa na OS X-u.

Podešavanje je jednostavno – dodajemo sledeće u .gitattributes:

*.ekstenzija -crlf -diff

Možemo koristiti i binary makro:

*.ekstenzija binary

Prikazivanje razlika

ODT

Jedan klasičan primer ispisa git diff komande uz binarne datoteke:

$ git diff diff --git deo1.odt deo2.odt index 88839c4..4afcb7c 100644 Binary files deo1.odt and deo2.odt differ

Za početak, objasnićemo kako da prikažemo razlike između ODT datoteka. Za to nam je potreban konverter iz ODT-a u TXT.

Treba dodati sledeće u .gitattributes:

*.odt diff=odt

Zatim dodajemo naredno u .git/config:

[diff "odt"] binary = true textconv = /usr/local/bin/odt-to-txt

/usr/local/bin/odt-to-txt možemo zameniti sa nekom drugom lokacijom na disku. Bitno je da je sadržaj skripte odt-to-txt kao na https://gist.github.com/ZDroid/9333954b63c44b6ecac2. Potom, menjamo dozvole u izvršne (komanda mora da se pokrene sa root naloga ako je skripta van korisnikove fascikle):

$ chmod +x /usr/local/bin/odt-to-txt

Sada možemo videti razlike između ODT datoteka.

Slike

Za razlike između slika koristimo exiftool (http://www.sno.phy.queensu.ca/~phil/exiftool/). Format slika je, recimo, PNG.

Potrebno je da dodamo sledeće u .gitattributes:

*.png diff=exif

Zatim konfiguracija:

$ git config diff.exif.textconv exiftool

Kada idući put budemo zamenili sliku i pokrenuli git diff dobijamo ispis sličan ovom:

diff --git slika1.png slika2.png index 88839c4..4afcb7c 100644 --- slika1.png +++ slika2.png @@ -1,12 +1,12 @@ ExifTool Version Number         : 7.74 -File Size                       : 80 kB -File Modification Date/Time     : 2013:07:20 10:12:50-07:00 +File Size                       : 95 kB +File Modification Date/Time     : 2013:07:20 12:12:50-07:00 File Type                       : PNG MIME Type                       : image/png -Image Width                     : 1000 -Image Height                    : 900 +Image Width                     : 1050 +Image Height                    : 950 Bit Depth                       : 8 Color Type                      : RGB with Alpha

Ključne reči za proširenje

Programeri često traže ključne reči za proširenje (keyword expansions) u SVN / CVS stilu. Problem sa Git-om postoji u tome što ne možemo ubaciti podatke o commit-u nakon što „komitujemo”, jer Git prvo generiše checksum.

Atributi mogu da ubace checksum trenutne razvojne grane u neku datoteku uz $Id$ promenljivu. Ne zaboravimo da to nije checksum commit-a. Potrebno je izvršiti ove komande u terminalu:

$ echo '*.txt ident' >> .gitattributes $ echo '$Id$' > test.txt

Sledeći put kada proverimo (check out) ovu datoteku Git će nam dati SHA-1 checksum:

$ rm test.txt $ git checkout -- test.txt $ cat test.txt $Id: 52812b7653c7b88933h8akd6c7d0ca15719b9bk3 $

Ipak, korišćenje SHA-a je ograničeno. U SVN-u i CVS-u možemo ubaciti i oznake za vreme – što SHA ne može. SHA može da nam kaže da li je neka datoteka novija ili starija od neke druge.

Atributi mogu da posluže i za filtriranje pojedinih putanja, a zatim podese skripte koje će obraditi datoteke pre nego što su proverene (smudge) ili pre nego što smo „komitovali” (clean).

Navešćemo jedan primer korišćenja filtera. Na internetu možemo naći mnogo Git filtera.

Možemo koristiti indent, program za filtriranje C kôda. Potrebno je da dodamo sledeći atribut:

*.c filter=indent

Onda bi trebalo podesiti Git tako da može da koristi indent kao filter:

$ git config --global filter.indent.clean indent $ git config --global filter.indent.smudge cat

Ovo će filtrirati C datoteke kroz indent tako što će ih „provući” kroz indent program pre „komitovanja”, a zatim kroz cat pre provere.

Izvoz

Ukoliko ne želimo da izvezemo neke datoteke ili fascikle prilikom korišćenja komande git archive možemo koristiti export-ignore atribut. Recimo da imamo db/ fasciklu koju ne želimo da izvezemo, dovoljno je da dodamo export-ignore atribut i ona neće biti izvezena. Potrebno je samo da dodamo sledeće u .gitattributes:

db/ export-ignore

Među opcijama je i korišćenje ključnih reči za proširenje. Git dozvoljava da se koristi $Format:$ uz bilo koju datoteku koja ima –pretty=formatshortcode-ove. Recimo da imamo datoteku LAST_COMMIT i želimo da u nju ubacimo datum poslednjeg commit-a. Podešavanje atributa je nalik ovome:

$ echo 'Datum poslednjeg commit-a: $Format:%cd$' > LAST_COMMIT $ echo "LAST_COMMIT export-subst" >> .gitattributes $ git add LAST_COMMIT .gitattributes $ git commit -am 'dodavanje LAST_COMMIT datoteke'

Kada arhivirate skladište programskih paketa, imaćete LAST_COMMIT datoteku i u njoj datum poslednjeg commit-a.

Merge

Merge takođe ima atribute. Atributima možemo odrediti strategiju spajanja (merge).

Recimo da imamo projekat sa 2 razvojne grane i da se na obe grane nalazi db.xml datoteka koja se razlikuje od one na drugoj grani. Ali ipak želimo da uradimo merge jedne grane u drugu, a da ne oštetimo db.xml. Potreban nam je sledeći atribut:

db.xml merge=ours

Sada nećemo imati konflikte između razvojnih grana.

$ git merge test Auto-merging db.xml Merge made by recursive.

Prethodni deo | Nastavak