Есть ли в git что-то вроде `svn propset svn: keys` или до / после фиксации хуков? - PullRequest
37 голосов
/ 02 сентября 2008

Просматривая документацию по git, я не вижу ничего похожего на хуки фиксации SVN или функции "propset", которые могут, например, обновлять номер версии или уведомление об авторских правах в файле всякий раз, когда он фиксируется в хранилище. 1001 *

Предполагается ли, что пользователи git будут писать внешние скрипты для такого рода функций (что не может быть и речи) или я просто упустил что-то очевидное?

Редактировать : Просто чтобы прояснить, меня больше интересует, например,

svn propset svn:keywords "Author Date Id Revision" expl3.dtx

где строка такая:

$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $

постоянно обновляется с соответствующей информацией всякий раз, когда происходит фиксация.

Ответы [ 5 ]

17 голосов
/ 17 сентября 2008

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

  1. Вы, вероятно, не хотите этого делать. Использование git describe является разумной альтернативой.
  2. Если вам нужно это сделать, $Id$ и $Format$ довольно просты.
  3. Для чего-то более продвинутого потребуется gitattributes и пользовательский фильтр. Я приведу пример реализации $Date$.

Решения, основанные на хуках, обычно бесполезны, поскольку они загрязняют вашу рабочую копию.

15 голосов
/ 02 сентября 2008

Цитирование из Git FAQ :

Есть ли в git расширение ключевых слов?

Не рекомендуется. Расширение ключевого слова вызывает все виды странных проблем и в любом случае не очень полезно, особенно в контексте SCM. за пределами Git вы можете выполнить расширение ключевых слов с помощью сценария. Экспорт ядра Linux скрипт делает это для установки переменной EXTRA_VERSION в Makefile.

Смотрите gitattributes (5), если вы действительно хотите это сделать. Если ваш перевод не обратимый (например, расширение ключевого слова SCCS) это может быть проблематично.

4 голосов
/ 02 сентября 2008

Git имеет хуки pre-commit и post-commit, они находятся внутри каждого каталога .git / hooks. Просто измените файлы и выполните команду chmod, чтобы сделать их исполняемыми.

1 голос
/ 24 января 2017

Несмотря на вековые вопросы и ответы. Я думал, что добавлю один, так как это долго беспокоило меня.

Я привык перечислять файлы в каталоге в обратном порядке (смешно, хе?). Причина в том, что я хотел бы видеть, какие файлы, которые у меня (или кто-то еще) изменились недавно.

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
1 голос
/ 02 сентября 2008

Возможно, наиболее распространенное свойство SVN 'svn: ignore' выполняется через файл .gitignore, а не через метаданные. Боюсь, у меня нет ничего более полезного для других видов метаданных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...