Чтобы поставить префикс? <Номер-ревизии> в коды Git / SVN - PullRequest
11 голосов
/ 14 июля 2009

Как вы можете эффективно использовать префикс ?v=VersionNumber для каждого файла в вашем хранилище с помощью Git / SVN?

Я обнаружил, что SO использует эту практику для предоставления номеров версий каждому конкретному файлу в своем репо.

Они используют SVN. Я хотел бы знать, как вы можете сделать то же самое с Git.

Несколько примеров.

# 1

<link rel="stylesheet" href="/content/all.css?v=3959">

# 2

<script src="./js/question.js?v=3955" type="text/javascript"></script>

Ответы [ 4 ]

15 голосов
/ 14 июля 2009

"в вашем хранилище"? в вашем хранилище напрямую ?
Это будет называться " расширение ключевого слова ", и это не рекомендуется (как обсуждалось в этом ТАК вопрос )

Помещение метаданных (номер редакции) в данные, хранящиеся в хранилище, может привести к проблемам слияния .

То, что вы видите на SO-страницах, является результатом процесса развертывания, который берет метаданные из SVN (ревизия) и помещает их в сгенерированные HTML-страницы.

GitFaq также не рекомендует его.
Эквивалент номеру ревизии SVN, интегрированному в файлы, развернутые на сервере, будет использовать git description , чтобы получить какое-то «количество коммитов», отображаемое на этапе развертывания. .

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


Чтобы проиллюстрировать это, давайте посмотрим, что сказал Линус во время первоначального обсуждения этой темы (апрель 2007 г.):

Добавление расширения не просто "сложнее". Это практически невозможно сделать с любым видом исполнения.
Подумайте "git checkout newbranch".
И подумайте, что мы делаем с файлами (и целыми подкаталогами!), Которые даже не изменились. И, наконец, подумайте, насколько важна эта оптимизация в SCM, подобном git, который поддерживает ветки.

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

Теперь, расширение не является тривиальным делом (на самом деле это то же самое, что и перевод "CRLF-> LF": технически это тоже просто "расширение"). И это должно работать.

То, как это делает нерасширенность, также нарушает "git diff", поскольку оно в основном всегда заставляет diff игнорировать ключевые слова. Другими словами, когда вы делаете

git diff A..B

и отправьте diff кому-нибудь еще, они никогда не увидят никаких ключевых слов!

Теперь, это, очевидно, удовлетворяет моему требованию, чтобы различия были пустыми, если A и B одинаковы, так что вы должны ожидать, что я буду счастлив.
Но я не счастлив, потому что, если другой человек также использует git, ОН НЕ МОЖЕТ ПРИМЕНЯТЬСЯ DIFF!
Даже если он находится в точке «А» и, таким образом, получает разность, которая должна применять точно , он получит отклонения, если будут другие изменения вокруг нерасширенного ключевого слова (которое он будет разросся в своем рабочем дереве, конечно!)

См? Ключевые слова просто не могут работать. Они сломаны. Либо вы можете игнорировать их (и не показывать их в diffs), в этом случае diff не работает, либо вы не можете игнорировать их (и показывать их в diffs), в этом случае diff * также broken, просто по-другому.

Единственный здравомыслящий и работоспособный случай - их вообще нет. Любое расширение ключевого слова всегда приводит к проблемам. Вы просто не можете сделать это правильно.

6 голосов
/ 15 июля 2009

Если этот номер версии , сгенерированный некоторым серверным скриптом : PHP, Perl, ASP.NET, Ruby on Rails ( VonC объяснил, почему расширение ключевого слова - плохая идея , то есть почему создание Git, а не обновление веб-сервера такой информации - плохая идея), тогда просто нужно запустить git description в этом сценарий.

Другое решение заключается в том, чтобы система развертывания (сборки) , которая копирует файлы из системы контроля версий на веб-сервер, встраивает эти данные. Например, gitweb, веб-интерфейс git для Git, написанный на Perl, имеет

our $version = "++GIT_VERSION++";

заменено системой сборки (make gitweb/gitweb.cgi) в результате выполнения GIT-VERSION-GEN. Это означает, например, что запущенный gitweb отображается в мета-заголовке «генератора», например:

<meta name="generator" content="gitweb/1.6.4.rc0.22.gfc1cf.dirty git/1.6.3.2.317.g2dd3f"/>
2 голосов
/ 06 февраля 2015

Может быть, вы искали это:

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

возможно установить хотя бы $ Id $, а использование фильтров предоставит вам еще несколько вариантов.

Пример (не лучший) из этот ответ

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

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

См. Руководство по git-attribute .

1 голос
/ 18 июля 2009

Игнорируя слово «эффективно» в вашем вопросе, вы должны искать «фильтр драйвера». Простое пятно, чтобы вставить ревизию, и чистка, чтобы удалить ее, должно делать то, что вы (думаете, что хотите).

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