Обновить строку идентификатора после регистрации
Я включил расширение $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 {}; }'