Есть ли в 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), это может быть проблематично.

Я написал довольно полный ответ на этот вопрос в другом месте с кодом, показывающим, как это сделать. Резюме:

  1. Вы, вероятно, не хотите делать это. С помощью git describe разумная альтернатива.
  2. Если вам нужно сделать это, $Id$ а также $Format$ довольно легко.
  3. Что-нибудь более продвинутое потребует использования 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
Другие вопросы по тегам