петак, 19 априла, 2024
Сам свој мајстор

Гит (7. део): Атрибути

Аутор: Златан Васовић

Коришћењем Git атрибута можемо подесити начин приказа разлика приликом коришћења git diff команде, филтер садржаја и стратегије спајања (енгл. merge).

Атрибуте можете подесити у .gitattributes (углавном се налази у кореној фасцикли складишта програмских пакета) и .git/info/attributes датотекама (уколико желите да сакријете подешавања).

Бинарне датотеке

Атрибути могу послужити за идентификовање бинарних датотека и давање инструкција Git-у за те датотеке.

Идентификовање

Често су неке датотеке приказане као текст, иако у том облику немају смисла већ су корисне само као бинарне датотеке. Пример – *.pbxproj – део сваког Xcode пакета на OS X-у.

Подешавање је једноставно – додајемо следеће у .gitattributes:

*.ekstenzija -crlf -diff

Можемо користити и binary макро:

*.ekstenzija binary

Приказивање разлика

ODT

Један класичан пример исписа git diff команде уз бинарне датотеке:

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

За почетак, објаснићемо како да прикажемо разлике између ODT датотека. За то нам је потребан конвертер из ODT-а у TXT.

Треба додати следеће у .gitattributes:

*.odt diff=odt

Затим додајемо наредно у .git/config:

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

/usr/local/bin/odt-to-txt можемо заменити са неком другом локацијом на диску. Битно је да је садржај скрипте odt-to-txt као на https://gist.github.com/ZDroid/9333954b63c44b6ecac2. Потом, мењамо дозволе у извршне (команда мора да се покрене са root налога ако је скрипта ван корисникове фасцикле):

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

Сада можемо видети разлике између ODT датотека.

Слике

За разлике између слика користимо exiftool (http://www.sno.phy.queensu.ca/~phil/exiftool/). Формат слика је, рецимо, PNG.

Потребно је да додамо следеће у .gitattributes:

*.png diff=exif

Затим конфигурација:

$ git config diff.exif.textconv exiftool

Када идући пут будемо заменили слику и покренули git diff добијамо испис сличан овом:

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

Кључне речи за проширење

Програмери често траже кључне речи за проширење (keyword expansions) у SVN / CVS стилу. Проблем са Git-ом постоји у томе што не можемо убацити податке о commit-у након што „комитујемо”, јер Git прво генерише checksum.

Атрибути могу да убаце checksum тренутне развојне гране у неку датотеку уз $Id$ променљиву. Не заборавимо да то није checksum commit-а. Потребно је извршити ове команде у терминалу:

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

Следећи пут када проверимо (check out) ову датотеку Git ће нам дати SHA-1 checksum:

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

Ипак, коришћење SHA-а је ограничено. У SVN-у и CVS-у можемо убацити и ознаке за време – што SHA не може. SHA може да нам каже да ли је нека датотека новија или старија од неке друге.

Атрибути могу да послуже и за филтрирање појединих путања, а затим подесе скрипте које ће обрадити датотеке пре него што су проверене (smudge) или пре него што смо „комитовали” (clean).

Навешћемо један пример коришћења филтера. На интернету можемо наћи много Git филтера.

Можемо користити indent, програм за филтрирање C кôда. Потребно је да додамо следећи атрибут:

*.c filter=indent

Онда би требало подесити Git тако да може да користи indent као филтер:

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

Ово ће филтрирати C датотеке кроз indent тако што ће их „провући” кроз indent програм пре „комитовања”, а затим кроз cat пре провере.

Извоз

Уколико не желимо да извеземо неке датотеке или фасцикле приликом коришћења команде git archive можемо користити export-ignore атрибут. Рецимо да имамо db/ фасциклу коју не желимо да извеземо, довољно је да додамо export-ignore атрибут и она неће бити извезена. Потребно је само да додамо следеће у .gitattributes:

db/ export-ignore

Међу опцијама је и коришћење кључних речи за проширење. Git дозвољава да се користи $Format:$ уз било коју датотеку која има –pretty=format shortcode-ове. Рецимо да имамо датотеку LAST_COMMIT и желимо да у њу убацимо датум последњег commit-а. Подешавање атрибута је налик овоме:

$ 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'

Када архивирате складиште програмских пакета, имаћете LAST_COMMIT датотеку и у њој датум последњег commit-а.

Merge

Merge такође има атрибуте. Атрибутима можемо одредити стратегију спајања (merge).

Рецимо да имамо пројекат са 2 развојне гране и да се на обе гране налази db.xml датотека која се разликује од оне на другој грани. Али ипак желимо да урадимо merge једне гране у другу, а да не оштетимо db.xml. Потребан нам је следећи атрибут:

db.xml merge=ours

Сада нећемо имати конфликте између развојних грана.

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

Претходни део | Наставак