2

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

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

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

Я ищу способ:

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

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

1 ответ1

1

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

Вы хотите делать \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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .