Git эквивалент расширения $ URL $ ключевого слова в Subversion
Я рассматриваю возможность перехода с Subversion на Git. Одна из вещей, которую мы используем subversion для наших системных администраторов, для управления такими вещами, как файлы конфигурации. Для этого мы ставим $URL$
в каждый файл, который расширяется до местоположения файла в дереве подрывной деятельности. Это позволяет администраторам просматривать файл на некотором произвольном хосте и выяснять, откуда в дереве он появился.
Ближайший аналог, который я смог найти, это gitattributes. Здесь filter=
директива, но кажется, что git не сообщает фильтру, какое имя файла он фильтрует, что нужно было бы включить $URL$
в путь.
Также есть ident
директива, которая бы превратить $Id$
в хэш блоба. Это может быть полезно, если можно отобразить это обратно в путь, но мой мерзавец недостаточно силен.
Какие-либо предложения?
Рабочий процесс выглядит следующим образом:
- Администратор фиксирует изменения в репозитории VCS
- Администратор обновляет центральное местоположение, которое проверило репо
- Администратор извлекает изменения на хост с помощью 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 могут выполнить задачу.
Это уже упоминалось в этом ответе.
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-адреса на лету для динамического связывания между компонентами.