Что здесь происходит: Git оптимизирован для быстрого переключения между ветками. В частности, git checkout
разработан так, чтобы не трогать файлы, идентичные в обеих ветвях.
К сожалению, подстановка ключевых слов RCS нарушает это. Например, использование $Date$
потребует git checkout
для прикосновения к каждому файлу в дереве при переключении ветвей. Для хранилища размером с ядро Linux это приведет к полной остановке.
В общем, лучше всего пометить хотя бы одну версию:
$ git tag v0.5.whatever
... и затем вызовите следующую команду из вашего Makefile:
$ git describe --tags
v0.5.15.1-6-g61cde1d
Здесь git сообщает мне, что я работаю над анонимной версией 6 коммитов после v0.5.15.1, с хешем SHA1, начинающимся с g61cde1d
. Если вы поместите вывод этой команды в файл *.h
где-нибудь, вы в деле, и у вас не будет проблем со связыванием выпущенного программного обеспечения с исходным кодом. Это предпочтительный способ ведения дел.
Если вы не можете избежать использования ключевых слов RCS, вы можете начать с этого объяснения Ларса Хемли . В принципе, $Id$
довольно просто, и если вы используете git archive
, вы также можете использовать $Format$
.
Но, если вы абсолютно не можете избежать ключевых слов RCS, вам следует начать:
git config filter.rcs-keyword.clean 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/"'
git config filter.rcs-keyword.smudge 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date: `date`\\\$/"'
echo '$Date$' > test.html
echo 'test.html filter=rcs-keyword' >> .gitattributes
git add test.html .gitattributes
git commit -m "Experimental RCS keyword support for git"
rm test.html
git checkout test.html
cat test.html
В моей системе я получаю:
$Date: Tue Sep 16 10:15:02 EDT 2008$
Если у вас возникли проблемы с выходом оболочки из команд smudge
и clean
, просто напишите собственные сценарии Perl для расширения и удаления ключевых слов RCS соответственно и используйте эти сценарии в качестве фильтра.
Обратите внимание, что вы действительно не хотите делать это для большего количества файлов, чем это абсолютно необходимо, иначе git потеряет большую часть своей скорости.