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

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

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

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

Какие-либо предложения?

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

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

4 ответа

Как уже упоминалось в "Есть ли что-нибудь подобное в git svn propset svn:keywords или до / после фиксации? ", Git не поддерживает расширение ключевых слов.

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


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

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

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

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

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

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

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

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

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

gitattributes (5)

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

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

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

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

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

Все URL развернутых файлов отражают это, например, http://host/d/sw/xyz/ac.

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

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

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