Вставьте дату и имя тега в исходные файлы LaTeX с помощью git
Я использую git для написания некоторых пакетов LaTeX. Чтобы использовать возможности релиза LaTeX, в каждом пакете должна быть строка следующего формата:
\ProvidesPackage{MyPackageName}[yyyy/mm/dd VersionNumber SomeText]
Я часто забываю обновить дату и номер версии, прежде чем загружать файлы в CTAN, и мне было интересно, можно ли использовать git для автоматизации этого.
Я ищу способ:
автоматически вставлять текущую дату в исходный код при каждой фиксации только для файлов, измененных в этой фиксации
автоматически вставлять текущую дату и номер версии во все файлы, когда я отмечаю версию (имя тега совпадает с номером версии)
1 ответ
Чтобы автоматически делать вещи с git
, используйте крючки
Ты хочешь сделать \thing{}
с каждым мерзавцем совершать? Вот для чего нужен крючок. Например, post-commit
крюк:
После завершения всего процесса фиксации запускается ловушка post-commit. Он не принимает никаких параметров, но вы можете легко получить последний коммит, запустив
git log -1 HEAD
, Обычно этот скрипт используется для уведомления или чего-то подобного.
с сайта / руководства GIT SCM
Добавление даты с каждым git commit
Это простая часть. Вы можете использовать этот хук для достижения первой части ваших двух целей довольно просто:
- использование
git diff-tree --no-commit-id --name-only -r HEAD
чтобы файлы были изменены в текущей ревизии (см. это объяснение в SO) - переберите эти файлы на выбранном вами языке и используйте инструмент по вашему выбору, чтобы вставить дату, например, с
sed
или жеawk
Если вы сделаете это локально, в вашей рабочей копии останутся измененные неотмеченные файлы; т.е. git status
покажет измененные файлы. Вы можете избежать этого, используя дополнительный репо, как показано ниже.
Добавление версии с каждымgit tag
Это немного сложнее.
Вы можете обойти тот факт, что git tag
не вызывает никаких перехватов при использовании промежуточного репозитория git - локально или удаленно - и git push
на этот репо каждый раз, когда вы помечаете. Вы могли бы тогда использоватьpost-update
подключите этот сервер для перезаписи на основе последней метки.
Например:
- Получить последнее название тега / версии:
git describe --tags $(git rev-list --tags --max-count=1)
- Отформатируйте файлы, используя
sed
(или жеawk
или какой инструмент вы выберете) - Загрузить в 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
крюк.