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

372
aloneprism

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

\ProvidesPackage[yyyy/mm/dd VersionNumber SomeText] 

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

Я ищу способ:

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

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

2

1 ответ на вопрос

1
bertieb

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

Вы хотите делать \thing{}с каждым git commit? Вот для чего нужен крючок . Например,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зацепку.

Фантастический ответ с очень хорошим объяснением! Большое спасибо! aloneprism 5 лет назад 0

Похожие вопросы