Чтобы поставить префикс?<Номер-ревизии> в коды Git/SVN
Как вы можете поставить префикс ?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 ответа
Может быть, вы искали это:
Как включить строку идентификатора для репозиториев 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-атрибутов.
"в вашем хранилище"? в вашем хранилище напрямую?
Это будет называться " расширением ключевых слов ", и это не рекомендуется (как обсуждалось в этом вопросе)
Помещение метаданных (номер редакции) в данные, хранящиеся в репозитории, может привести к проблемам слияния.
То, что вы видите на страницах SO, является результатом процесса развертывания, который берет метаданные из SVN (ревизия) и помещает их в сгенерированные страницы HTML.
GitFaq тоже не рекомендует.
Эквивалент номеру ревизии SVN, интегрированному в файлы, развернутые на сервере, будет использовать git description, чтобы получить какой-то "счетчик коммитов", который будет отображаться на этапе развертывания.
Но запись его непосредственно в хранилище будет означать расширение ключевых слов и расширение ключевых слов.
Чтобы проиллюстрировать это, давайте посмотрим, что сказал Линус во время первоначального обсуждения этой темы (апрель 2007 года):
Добавление расширения не просто "сложнее". Это в принципе невозможно сделать с любым видом исполнения.
Считать "git checkout newbranch
".
И подумайте, что мы делаем с файлами (и целыми подкаталогами!), Которые даже не изменились. И наконец, подумайте о том, насколько важна эта оптимизация в SCM, подобном git, который поддерживает ветки.[] фундаментальные проблемы, которые возникают при расширении ключевых слов (т.е. переключение ветвей в принципе невозможно сделать без проверки каждого_синг_файла с установленным атрибутом "ключевое слово". Есть и другие).
Расширение тривиально (сделать то же самое, что перевод "CRLF->LF": технически это тоже просто "расширение"). И это должно работать.
То, как это делает нерасширенность, также нарушает "git diff", поскольку оно всегда заставляет diff игнорировать ключевые слова. Другими словами, когда вы делаете
git diff A..B
и отправьте diff кому-то еще, они никогда не увидят никаких ключевых слов!
Теперь это, очевидно, соответствует моему требованию, чтобы разность была пустой, если A и B одинаковы, так что вы должны ожидать, что я буду счастлив.
Но я не счастлив, потому что, если другой человек также использует git, ОН НЕ МОЖЕТ ДАЖЕ ПРИМЕНЯТЬ DIFF!
Даже если он находится в точке "А" и, таким образом, получает разность, которая должна применяться точно, он получит отклонения, если будут другие изменения вокруг нерасширенного ключевого слова (которое он, конечно, расширит в своем рабочем дереве!)Увидеть? Ключевые слова просто не могут работать. Они сломаны. Либо вы можете игнорировать их (и не показывать их в diff-файлах), в этом случае diff не работает, либо вы не можете игнорировать их (и показывать их в diff-файлах), в этом случае diff также нарушается, просто по-другому.
Единственный разумный и выполнимый случай - не иметь их вообще. Любое расширение ключевых слов всегда приводит к проблемам. Вы просто не можете сделать это правильно.
Если этот номер версии генерируется каким-либо серверным скриптом: 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"/>
Игнорируя слово "эффективно" в вашем вопросе, вы должны искать "фильтр драйвера". Простое пятно, чтобы вставить ревизию, и чистка, чтобы удалить ее, должно делать то, что вы (думаете, что вы) хотите.