Вставьте дату и имя тега в исходные файлы LaTeX с помощью git

Я использую git для написания некоторых пакетов LaTeX. Чтобы использовать возможности релиза LaTeX, в каждом пакете должна быть строка следующего формата:

\ProvidesPackage{MyPackageName}[yyyy/mm/dd VersionNumber SomeText]

Я часто забываю обновить дату и номер версии, прежде чем загружать файлы в CTAN, и мне было интересно, можно ли использовать git для автоматизации этого.

Я ищу способ:

  1. автоматически вставлять текущую дату в исходный код при каждой фиксации только для файлов, измененных в этой фиксации

  2. автоматически вставлять текущую дату и номер версии во все файлы, когда я отмечаю версию (имя тега совпадает с номером версии)

1 ответ

Решение

Чтобы автоматически делать вещи с git, используйте крючки

Ты хочешь сделать \thing{} с каждым мерзавцем совершать? Вот для чего нужен крючок. Например, post-commit крюк:

После завершения всего процесса фиксации запускается ловушка post-commit. Он не принимает никаких параметров, но вы можете легко получить последний коммит, запустив git log -1 HEAD, Обычно этот скрипт используется для уведомления или чего-то подобного.

с сайта / руководства GIT SCM

Добавление даты с каждым git commit

Это простая часть. Вы можете использовать этот хук для достижения первой части ваших двух целей довольно просто:

  1. использование git diff-tree --no-commit-id --name-only -r HEAD чтобы файлы были изменены в текущей ревизии (см. это объяснение в SO)
  2. переберите эти файлы на выбранном вами языке и используйте инструмент по вашему выбору, чтобы вставить дату, например, с sed или же awk

Если вы сделаете это локально, в вашей рабочей копии останутся измененные неотмеченные файлы; т.е. git statusпокажет измененные файлы. Вы можете избежать этого, используя дополнительный репо, как показано ниже.

Добавление версии с каждымgit tag

Это немного сложнее.

Вы можете обойти тот факт, что git tag не вызывает никаких перехватов при использовании промежуточного репозитория git - локально или удаленно - и git pushна этот репо каждый раз, когда вы помечаете. Вы могли бы тогда использоватьpost-updateподключите этот сервер для перезаписи на основе последней метки.

Например:

  1. Получить последнее название тега / версии:git describe --tags $(git rev-list --tags --max-count=1)
  2. Отформатируйте файлы, используяsed(или жеawkили какой инструмент вы выберете)
  3. Загрузить в CTAN из этого каталога

Разве я не могу сделать это с другим крючком?

Можно определить, имеет ли ссылка тег, используя git describe, например:

# In a working git repo
$ git tag -a "test1" -m "test tag"
$ git describe --exact-match HEAD
test1
$ git describe --exact-match HEAD^1
fatal: no tag exactly matches 'f8a1d888151809ccfbb3460bbcf310541967e292'
128

Однако, используя git tag не вызовет commit крюк.

Другие вопросы по тегам