Обновить строку идентификатора после регистрации

Я включил расширение $Id:$ с помощью ident в .gitattributes файл. Это позволяет мне быстро определить, является ли файл устаревшим, когда кто-то еще проверил мой репозиторий и установил его оттуда.

Теперь я также синхронизирую содержимое своего собственного Git-репозитория с другими (не разработанными, то есть без Git) системами. Проблема в том, что раскрытие ключевого слова происходит только при оформлении заказа, но мой рабочий процесс - commit -> push -> sync, поэтому синхронизированные копии содержат устаревшие идентификаторы.

Как я могу легко форсировать обновление идентификаторов после локальной фиксации? (Бонусные баллы за выполнение этого автоматически после любого коммита!)

Просто git checkout не работает (также не с --force), вероятно, потому что содержимое файла не изменилось. Ни один не делает git checkout-index --force, Мне удалось сделать это только с помощью локальной модификации (громоздко, нужно знать измененные файлы):

$ echo "modified" >> file
$ git checkout file

или временно проверив предыдущий коммит:

$ git checkout HEAD^
$ git checkout HEAD@{1}

2 ответа

Решение

Это можно сделать с помощью хука post-commit. Я автоматизировал установку с помощью скрипта, который поддерживается как часть моего репозитория git-extensions:

$ git-ident-update --help
Update the expansion of $Id$ to $Id:...$ via ident in the .gitattributes
after a commit.
To do this automatically in the future, invoke with --install.
Usage: git-ident-update [--install|--uninstall|--status|--set [<path>[ <path> ...]]] [-?|-h|--help]

Вот некоторые предложения:

git checkout --force . или, может быть git checkout --force file.txt

Если одна из этих команд работает, вы можете создать скрипт .git/hooks/post-commit и пусть этот скрипт будет однострочным, который вызывает эту команду (или любую другую команду), а затем git будет делать это при каждом коммите. Я полагаю, что для скриптов-ловушек корень рабочей директории (где находится папка.git) автоматически устанавливается в качестве cwd для скрипта.

РЕДАКТИРОВАТЬ:

Если вы бежите touch file.txt; git checkout file.txt тогда git выполнит полную проверку, включая применение атрибута идент, когда я это проверял. надеюсь, что это может быть использовано как-то

Я запускаю touch и git checkout для недавно обновленных файлов, в которых есть git Id, используя следующую команду:

find . -type f -mtime -1 -a -not -name '*~' | \
   xargs grep -l '$Id:' | \
   xargs --replace --verbose sh -c '{ touch {} ; git checkout {}; }'
Другие вопросы по тегам