Как включить строку идентификатора для репозитория Git?

Как включить ident $Id$ на файлы в репозитории Git?

3 ответа

Описание: рекомендуемый способ внедрения информации о версии в продукт - использовать для этого систему сборки; см. ниже для деталей и альтернативных подходов.


В Git (и я думаю, что обычно также в других системах VCS с атомарными коммитами) нет такой вещи, как версия одного файла.

Git поддерживает расширение по требованию $Id:$ ключевое слово, но:

  1. Это делается только по запросу. Вы должны указать (возможно, используя шаблон глобирования), что файл (или набор файлов) имеет ident набор атрибутов (в файле ".gitattributes" в дереве или в ".git / info / attribute" для настроек локального репозитория).
  2. Он расширяется до SHA-1 содержимого файла (или, точнее, до $Id:<sha-1 of blob>$). Причиной этого выбора является то, что Git не касается файлов, которые не изменились во время переключения ветвей или перемотки; если "$Id:$" расширен до информации о ревизии, потребуется обновить каждый файл с управлением версиями, например, при переключении веток.

Git поддерживает довольно широкий набор $Format:...$ заполнители, которые расширяются для фиксации информации (например, $Format:%H$ заменяется хешем коммита) но:

  1. Расширение выполняется только при запуске git-архива, в его выходном файле.
  2. Это делается по запросу, контролируется с помощью export-subst приписывать.

Рекомендуемый способ встраивания информации о версии - это сделать через систему сборки (на этапе сборки); см., например, Git Makefile и скрипт GIT-VERSION-GEN, используемые Makefile в веб-интерфейсе Git для репозитория git.git.

Однако вы можете (ab) использовать драйвер фильтра clean/smudge (через filter атрибут) для получения CVS-подобного расширения ключевых слов, расширения ключевых слов при оформлении заказа и очистки их при вводе содержимого в хранилище.

Вы можете сделать это, добавив шаблон, для файлов которого вы хотите эту функцию, а затем ident в .gitattributes файл. Это заменит $Id$ на $Id:<40-значный SHA>$ при извлечении файла. Обратите внимание, что он не даст вам номер версии файла, как в CVS/SVN.

Пример:

$ echo '*.txt ident' >> .gitattributes
$ echo '$Id$' > test.txt
$ git commit -a -m "test"

$ rm test.txt
$ git checkout -- test.txt
$ cat test.txt

Ссылка на gitattributes(5) Страница руководства

Идентификатор Git не делает то, что делает $Id$ в других системах контроля версий. Для этого используйте RCS вместе с git: RCS для отдельных версий файлов и git для проверки проекта в целом. Как я уже сказал, это клудж, но это действительно имеет смысл (иногда для некоторых вещей).

Jakub Narębski в своем ответе (более 10 лет назад) предположил:

Однако вы можете (ab) использовать драйвер фильтра clean/smudge (через атрибут filter), чтобы получить расширение ключевых слов в стиле CVS, раскрытие ключевых слов при оформлении заказа и их очистку при вводе содержимого в репозиторий.

Критика (от Arioch 'The в комментариях)

Драйвер фильтра был бы действительно отличным, если бы он действительно имел хоть какую-то мощность.
Насколько известно, в качестве параметра используется только имя файла: это даже меньше, чемidentфильтр, который получает BLOB SHA1 в качестве параметра.

В Git 2.27 (второй квартал 2020 г.) фильтры содержимого Git больше не бессильны!

Git 2.27 предоставляет дополнительную информацию (например, объект дерева, в котором появляется конвертируемый большой двоичный объект, в дополнение к его пути, который уже был указан) для размытия / очистки фильтров преобразования.

См. Commit 0c0f8a7, commit 4cf76f6, commit 3f26785, commit dfc8cdc, commit 13e7ed6, commit c397aac, commit ab90eca (16 Mar 2020), and commit a860476 (10 Mar 2020) by brian m. Карлсон (``).
(Слияние Junio ​​C Hamano -gitster- в коммите 4e4baee, 27 марта 2020 г.)

convert: разрешить передачу дополнительных метаданных для процессов фильтрации

Подписано: brian m. Карлсон

Существует множество ситуаций, когда процесс фильтрации может использовать некоторые дополнительные метаданные.

Например, некоторые люди находят фильтр идентификатора слишком ограничивающим и хотели бы включить фиксацию или ветвь в свои нечеткие файлы.

Эта информация недоступна во время оформления заказа, поскольку HEAD на тот момент не обновлялась, и она также не будет доступна в архивах.

Давайте добавим способ передать эти метаданные фильтру.

Мы передаем blob-объект, с которым мы работаем, древовидный (предпочитая фиксацию дереву, если он существует) и ссылку, с которой мы работаем.

Обратите внимание, что мы не будем передавать эту информацию во всех случаях, например, при перенормировке или при выполнении различий, поскольку в этих случаях это не имеет смысла.

Данные, которые мы в настоящее время получаем в процессе фильтрации, выглядят следующим образом:

command=smudge
pathname=git.c
0000

С этим изменением мы получим данные примерно такого рода:

command=smudge
pathname=git.c
refname=refs/tags/v2.25.1
treeish=c522f061d551c9bb8684a7c3859b2ece4499b56b
blob=7be7ad34bd053884ec48923706e70c81719a8660
0000

Об этом подходе следует отметить несколько моментов.

Для таких операций, как checkout, treeish всегда будет фиксацией, поскольку мы не можем проверять отдельные деревья, но для других операций, таких как архивирование, мы можем работать только с определенным деревом, поэтому мы предоставим только дерево в качестве treeish.

Аналогичные комментарии применимы к refname, поскольку есть множество случаев, когда у нас не будет ref.

А также:

convert: предоставить дополнительные метаданные для фильтров

Подписано: brian m. Карлсон

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

Два основных места, где мы передаем эти метаданные, - это кассы и архивы.
В этих двух ситуациях чтение HEAD не является допустимым вариантом, поскольку HEAD не обновляется для извлечения, пока не будет записано рабочее дерево, и архивы могут принять произвольное дерево.

В других ситуациях HEAD обычно отражает ссылочное имя ветки, которая используется в настоящее время.

Мы передаем меньший объем данных в других случаях, например git cat-file, где мы можем знать о капле только логически.

Другие вопросы по тегам