diff --git a/book/08-customizing-git/sections/attributes.asc b/book/08-customizing-git/sections/attributes.asc index 64b17560..e0db3171 100644 --- a/book/08-customizing-git/sections/attributes.asc +++ b/book/08-customizing-git/sections/attributes.asc @@ -106,16 +106,23 @@ index 0b013ca..ba25db5 100644 Many people's version-control method of choice is to copy files into another directory (perhaps a time-stamped directory, if they're clever). This approach is very common because it is so simple, but it is also incredibly error prone. It is easy to forget which directory you're in and accidentally write to the wrong file or copy over files you don't mean to. ---- -Git сообщает нам, что была добавлена строка ``Testing: 1, 2, 3.''. -Решение не идеальное -- изменения форматирования не отображаются -- но работает. +Git кратко сообщает нам, что была добавлена строка ``Testing: 1, 2, 3.''. +Решение не идеальное -- изменения форматирования не отображаются -- но это работает. Проблему сравнения файлов изображений можно решить аналогичным образом. Один из способов реализации заключается в передаче изображения на фильтр для извлечения EXIF информации -- метаданных, которые сохраняются для большинства форматов изображений. -Скачав и установив программу `exiftool`, вы сможете использовать её для сравнения изменений метаданных изображения: +Скачав и установив программу `exiftool`, вы сможете использовать её для конвертации изображений в текстовые метаданные, изменение которых будет являться текстовым представлением изменений изображений. +Добавьте следующую строку в ваш файл `.gitattributes`: + +[source,ini] +---- +*.png diff=exif +---- + +Настройте Git на использование этой программы: [source,console] ---- -$ echo '*.png diff=exif' >> .gitattributes $ git config diff.exif.textconv exiftool ---- @@ -156,11 +163,18 @@ index 88839c4..4afcb7c 100644 Для начала, вы можете автоматически добавлять SHA-1 хэш объекта в поле `$Id$`. Если установить этот атрибут для одного или нескольких файлов, то каждый раз при извлечении ветки Git будет заменять это поле на SHA-1 хэш объекта. -Важно заметить, что это SHA-1 хэш не коммита, а самого объекта: +Важно заметить, что это SHA-1 хэш не коммита, а самого объекта. +Добавьте следующую строку в ваш файл `.gitattributes`: + +[source,ini] +---- +*.txt ident +---- + +Добавьте ссылку на `$Id$` в тестовый файл: [source,console] ---- -$ echo '*.txt ident' >> .gitattributes $ echo '$Id$' > test.txt ---- @@ -222,8 +236,7 @@ last_date = `git log --pretty=format:"%ad" -1` puts data.gsub('$Date$', '$Date: ' + last_date.to_s + '$') ---- -Всё, что делает скрипт -- это получает дату последнего коммита с помощью команды `git log`, заменяет результатом все подстроки `$Date$` и возвращает результат. -Вы можете написать аналогичный скрипт на любом языке. +Всё, что делает скрипт -- это получает дату последнего коммита с помощью команды `git log`, заменяет результатом все подстроки `$Date$` и возвращает итоговый результат; вы можете написать аналогичный скрипт на любом языке. Назовите файл со скриптом, например, `expand_date` и сохраните в директории с программами. Теперь, нужно настроить Git фильтр (назовите его `dater`) и укажите ему использовать ваш скрипт `expand_date` при извлечении файлов. Вместе с этим, мы будем использовать регулярное выражение Perl для очистки перед коммитом: @@ -237,10 +250,14 @@ $ git config filter.dater.clean 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/" Указанная Perl команда очищает любое значение в строке, где она видит `$Date$`, чтобы вернуть файл в изначальное состояние. Теперь фильтр готов и вы можете проверить его добавив ключевое слово `$Date$` в файл и настроив Git атрибут, чтобы для вашего файла применялся созданный фильтр: +[source,ini] +---- +date*.txt filter=dater +---- + [source,console] ---- $ echo '# $Date$' > date_test.txt -$ echo 'date*.txt filter=dater' >> .gitattributes ---- Если добавить в коммит последние изменения, а затем извлечь файл, то вы увидите корректную подстановку ключевого слова: @@ -272,7 +289,7 @@ $ cat date_test.txt Например, у вас есть несколько файлов в директории `test/` и совершенно нет смысла включать их в архив вашего проекта. В этом случае достаточно добавить следующую строку в файл `.gitattributes`: -[source] +[source,ini] ---- test/ export-ignore ---- @@ -281,14 +298,18 @@ test/ export-ignore ===== `export-subst` -При создании архива так же доступна простая подстановка по ключевым словам. -Git допускает размещение строк `$Format:$` в любом файле с любой комбинацией `--pretty=format` кодов, большинство из которых вам известны по Разделу 2. -Например, если вы хотите добавить файл с именем `LAST_COMMIT`, в который будет добавляться дата последнего коммита при создании архива, то сделайте следующее: +При создании архива так же доступна подстановка по ключевым словам и поддерживается использование форматирования `git log` для файлов, отмеченных атрибутом `export-subst`. + +Например, если вы хотите добавить в проект файл с именем `LAST_COMMIT`, в который при экспорте будут автоматически сохраняться метаданные последнего коммита, то измените файлы `.gitattributes` и `LAST_COMMIT` следующим образом: + +[source,ini] +---- +LAST_COMMIT export-subst +---- [source,console] ---- -$ echo 'Last commit date: $Format:%cd$' > LAST_COMMIT -$ echo "LAST_COMMIT export-subst" >> .gitattributes +$ echo 'Last commit date: $Format:%cd by %aN$' > LAST_COMMIT $ git add LAST_COMMIT .gitattributes $ git commit -am 'adding LAST_COMMIT file for archives' ---- @@ -297,10 +318,32 @@ $ git commit -am 'adding LAST_COMMIT file for archives' [source,console] ---- -$ cat LAST_COMMIT -Last commit date: $Format:Tue Apr 21 08:38:48 2009 -0700$ +$ git archive HEAD | tar xCf ../deployment-testing - +$ cat ../deployment-testing/LAST_COMMIT +Last commit date: Tue Apr 21 08:38:48 2009 -0700 by Scott Chacon +---- + +В качестве подстановок можно использовать, например, сообщение коммита и `git notes`, а `git log` может делать простой перенос слов: + +[source,console] +---- +$ echo '$Format:Last commit: %h by %aN at %cd%n%+w(76,6,9)%B$' > LAST_COMMIT +$ git commit -am 'export-subst uses git log'\''s custom formatter + +git archive uses git log'\''s `pretty=format:` processor +directly, and strips the surrounding `$Format:` and `$` +markup from the output. +' +$ git archive @ | tar xfO - LAST_COMMIT +Last commit: 312ccc8 by Jim Hill at Fri May 8 09:14:04 2015 -0700 + export-subst uses git log's custom formatter + + git archive uses git log's `pretty=format:` processor directly, and + strips the surrounding `$Format:` and `$` markup from the output. ---- +Полученный архив подходит для использования, но как и любой экспортированный архив не годится для дальнейшей разработки. + ==== Стратегии слияния (((merging, strategies))) @@ -316,7 +359,7 @@ Last commit date: $Format:Tue Apr 21 08:38:48 2009 -0700$ database.xml merge=ours ---- -А затем определить фиктивную стратегию слияния выполнив команду: +А затем определить фиктивную стратегию слияния `ours`, выполнив команду: [source,console] ----