Есть ли в git что-то вроде `svn propset svn:keys` или до / после фиксации хуков?
Просматривая документацию по git, я не вижу ничего похожего на хуки коммитов SVN или функции "propset", которые могут, например, обновлять номер версии или уведомление об авторских правах в файле всякий раз, когда он фиксируется в репозитории.
Предполагается ли, что пользователи git будут писать внешние скрипты для такого рода функций (что не может быть и речи) или я просто упустил что-то очевидное?
Изменить: Просто чтобы быть ясно, я больше заинтересован, например,
svn propset svn:keywords "Author Date Id Revision" expl3.dtx
где такая строка:
$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $
постоянно обновляется с соответствующей информацией всякий раз, когда происходит коммит.
5 ответов
Цитирование из Git FAQ:
У git есть расширение ключевых слов?
Не рекомендуется. Расширение ключевого слова вызывает всевозможные странные проблемы и не очень полезно в любом случае, особенно в контексте SCM. Вне git вы можете выполнить расширение ключевых слов, используя скрипт. Сценарий экспорта ядра Linux делает это для установки переменной EXTRA_VERSION в Makefile.
Смотрите gitattributes(5), если вы действительно хотите это сделать. Если ваш перевод необратим (например, расширение ключевого слова SCCS), это может быть проблематично.
Я написал довольно полный ответ на этот вопрос в другом месте с кодом, показывающим, как это сделать. Резюме:
- Вы, вероятно, не хотите делать это. С помощью
git describe
разумная альтернатива. - Если вам нужно сделать это,
$Id$
а также$Format$
довольно легко. - Что-нибудь более продвинутое потребует использования
gitattributes
и пользовательский фильтр. Я приведу пример реализации$Date$
,
Решения, основанные на хуках, обычно бесполезны, потому что они загрязняют вашу рабочую копию.
Git имеет хуки pre-commit и post-commit, они находятся внутри каждого каталога.git/hooks. Просто измените файлы и выполните команду chmod, чтобы сделать их исполняемыми.
Пожалуй, самое распространенное свойство SVN, svn:ignore, выполняется через файл.gitignore, а не через метаданные. Боюсь, у меня нет ничего более полезного для других видов метаданных.
Хотя вековой Q&A. Я думал, что добавлю один, так как это беспокоило меня долгое время.
Я привык перечислять файлы в каталоге в обратном порядке (смешно, а?). Причина в том, что я хотел бы видеть, какие файлы, которые у меня (или кто-то еще) изменился недавно.
Git испортит мои планы, потому что при переключении ветки локальное хранилище полностью перезаписывает отслеживаемые файлы из (инкрементных... я знаю...) копий, которые находятся в упакованном локальном хранилище.
Таким образом, все извлеченные файлы будут иметь отметку времени оформления и не будут отражать время их последнего изменения..... Как это раздражает.
Итак, я разработал однострочную версию в bash, которая будет обновлять свойство $Date:$ внутри любого файла со ВРЕМЕНЕМ ПОСЛЕДНЕЙ МОДИФИКАЦИИ В СООТВЕТСТВИИ С НАСТОЯЩИМ ФАЙЛОВОЙ СИСТЕМОЙ, чтобы у меня был немедленный статус, сообщающий о последней модификации без необходимости просматривать git log
, git show
или любой другой инструмент, который дает время фиксации в режиме обвинения.
Следующая процедура изменит ключевое слово $Date:$ только в отслеживаемых файлах, которые будут зафиксированы в репо. Оно использует git diff --name-only
который будет перечислять файлы, которые были изменены, и ничего больше....
Я использую этот однострочник вручную перед тем, как фиксировать код. Одна вещь, однако, заключается в том, что я должен перейти в корневой каталог репозитория, прежде чем применять это.
Вот вариант кода для Linux (вставлен как многострочный для удобства чтения)
git diff --name-only | xargs stat -c "%n %Y" 2>/dev/null | \
perl -pe 's/[^[:ascii:]]//g;' | while read l; do \
set -- $l; f=$1; shift; d=$*; modif=`date -d "@$d"`; \
perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
git add $f; done
и OSX
git diff --name-only | xargs stat -f "%N %Sm" | while read l; do \
set -- $l; f=$1; shift; d=$*; modif=`date -j -f "%b %d %T %Y" "$d"`; \
perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
git add $f; done