Skip to content

Commit

Permalink
Внесены дополнения из оригинала
Browse files Browse the repository at this point in the history
  • Loading branch information
Morganov committed Mar 8, 2020
1 parent ffe6bc7 commit 9e8a876
Showing 1 changed file with 61 additions and 18 deletions.
79 changes: 61 additions & 18 deletions book/08-customizing-git/sections/attributes.asc
Original file line number Diff line number Diff line change
Expand Up @@ -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
----

Expand Down Expand Up @@ -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
----

Expand Down Expand Up @@ -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 для очистки перед коммитом:
Expand All @@ -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
----

Если добавить в коммит последние изменения, а затем извлечь файл, то вы увидите корректную подстановку ключевого слова:
Expand Down Expand Up @@ -272,7 +289,7 @@ $ cat date_test.txt
Например, у вас есть несколько файлов в директории `test/` и совершенно нет смысла включать их в архив вашего проекта.
В этом случае достаточно добавить следующую строку в файл `.gitattributes`:

[source]
[source,ini]
----
test/ export-ignore
----
Expand All @@ -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'
----
Expand All @@ -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)))
Expand All @@ -316,7 +359,7 @@ Last commit date: $Format:Tue Apr 21 08:38:48 2009 -0700$
database.xml merge=ours
----

А затем определить фиктивную стратегию слияния выполнив команду:
А затем определить фиктивную стратегию слияния `ours`, выполнив команду:

[source,console]
----
Expand Down

0 comments on commit 9e8a876

Please sign in to comment.