Git эквивалент расширения ключевого слова subversion $URL $

Я рассматриваю переход из подрывной программы в git. Одна из вещей, которые мы используем подрывную деятельность для наших системных администраторов для управления такими вещами, как файлы конфигурации. С этой целью мы помещаем $URL$ в каждый файл, который расширяется до расположения файла в дереве subversion. Это позволяет администраторам смотреть на файл на каком-то произвольном хосте и определять, в каком дереве он появился.

Самый близкий аналог, который я мог найти, - это gitattributes. Существует директива filter=, но кажется, что git не сообщает фильтру, какое имя файла он фильтрует, что необходимо было бы превратить $URL$ в путь.

Существует также директива ident, которая превратит $Id$ в хэш блоба. Это может быть полезно, если можно было отобразить это обратно в путь, но мой git -fu недостаточно силен.

Любые предложения?

Рабочий процесс выглядит следующим образом:

  • Администратор фиксирует изменения в репозитории VCS
  • Администратор обновляет центральное место, которое провело репо
  • Администратор переносит изменения на хост с помощью cfengine

Ответ 1

Как упоминалось в "Имеет ли git что-нибудь вроде svn propset svn:keywords или перехватчиков pre-/post-commit?" , git не поддерживает расширение ключевого слова.

"Работа с расширением ключевого слова SVN с помощью git -sv" предоставляет решение на основе git config filter (которое не совсем то, что вы хотите) и/или gitattributes.


Ближайший пример, если расширение файловой информации я нашел, что оно все еще основано на методе smudge/clean, с этим git хэш-фильтром, но чистая часть удаляет его из файла, и путь не найден.

Этот поток фактически говорит об этом (а также упоминает некоторые команды git -fu, которые могут содержать то, что вы ищете, Я их не тестировал):

В любом случае, smudge/clean не дает немедленного решения проблемы из-за небольших технических недостатков:

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

  • Фильтр smudge не передается идентификатором фиксации. Это немного более серьезно, так как эта информация нигде не может быть получена в противном случае.
    Я попытался использовать значение "HEAD", но, по-видимому, он еще не обновлен в момент запуска "smudge", поэтому файлы заканчиваются датой "предыдущей" фиксации, а не фиксацией. > "Предыдущее" означает фиксацию, которая была проверена ранее. Проблема ухудшается, если другая ветка проверяется, так как файлы получают временную метку предыдущей ветки.

AFAIR, отсутствие информации в фильтре smudge было преднамеренным, чтобы препятствовать этому конкретному использованию механизма smudge/clean. Тем не менее, я думаю, что это может быть пересмотрено с учетом использования Петера: рабочее пространство "только для проверки" для немедленной публикации на веб-сервере.
В качестве альтернативы, любой, кто интересуется этим вариантом использования, может реализовать дополнительные аргументы smudge в качестве локального патча на сайте.

И тогда есть небольшие неприятности, которые кажутся неизбежными: если вы измените "чистый" фильтр и проведете более раннюю ревизию, он будет сообщаться как имеющий изменения (из-за изменения "чистого" определения).

Ответ 2

Так как в настоящее время существует опция %f, сценарии типа git-rcs-keywords могут выполнять задачу.

Это уже упоминалось в этом ответе.

gitattributes (5) manpage:

Sequence "%f" on the filter command line is replaced with
the name of the file the filter is working on. A filter 
might use this in keyword substitution. For example:

[filter "p4"]
    clean = git-p4-filter --clean %f
    smudge = git-p4-filter --smudge %f

Ответ 3

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

Если да, можете ли вы изменить свой процесс, чтобы файлы были извлечены в репозиторий git, а script выполнила проверку $URL$ или другого ключевого слова после. Таким образом, вы можете делать любые подстановки, которые вам нравятся, и ограничиваться только тем, что может быть определено script в выгруженном репозитории.

Ответ 4

Мы используем решение "канонического пути" в наших развертываниях (все они внутренние, FWIW).

Все программное обеспечение входит, например. /d/sw/xyz/a.c или D:\SW\xyz\a.c

Все URL-адреса для развернутых файлов отражают это, например, Http:.//host/d/sw/xyz/a.c

URL-адреса файлов репозитория начинаются с "sw", например. git://githost/gitrepo/xyz/a.c

Мы кодируем эти канонические пути в конфигурации (если это когда-либо понадобится изменить), и у нас есть скрипты /API, которые генерируют/ссылаются на URL-адреса "на лету" для динамического связывания между компонентами.