Чтобы поставить префикс?<Номер-ревизии> в коды 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"/>

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

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