Я использую git-svn для взаимодействия с существующим репозиторием SVN, который содержит некоторые проекты C ++. subwcrev.exe используется в качестве события перед сборкой для обновления некоторых строк в заголовке C ++ (svnversion.h). Эти строки жестко компилируются, чтобы сформировать некоторую информацию о версии полученного двоичного файла.
Поскольку для работы subwcrev требуются метаданные .svn, событие предварительной сборки завершится неудачно при использовании рабочей копии git-svn. Итак, я придумал следующий скрипт bash, который я использую в качестве ловушек post-commit и post-checkout для моего git-репозитория. Сценарий пытается сделать то же самое, что и subwcrev, основываясь на выводе git svn info (кэшируется в локальном файле).
#!/bin/sh
if [ ! -f svninfo ] ; then
git svn info > svninfo
fi
revision=`sed -e "/Revision/!d" -e "s/Revision: \(.*\)/\1/" svninfo`
lastchange=`sed -e "/Last Changed Rev/!d" -e "s/Last Changed Rev: \(.*\)/\1/" svninfo`
# Get the last changed date, extract timestamp, replaces dashes with slashes
changedate=`sed -e "/Last Changed Date/!d" -e "s/Last Changed Date: \(.\{19\}\).*/\1/" -e "s!-!\\\\\\/!g" svninfo`
now=`date "+%Y\/%m\/%d %H:%M:%S"`
gitcommit=`git show --abbrev-commit | sed -n -e "s/commit //p"`
for entry in $( find -name svnversion_template.h ); do
newname=`echo $entry|sed -e "s/_template//"`
sed -e "s/\\\$WCRANGE\\\$/${revision}/" \
-e "s/\\\$WCREV\\\$/${lastchange}-${gitcommit}/" \
-e "s/\\\$WCDATE\\\$/${changedate}/" \
-e "s/\\\$WCNOW\\\$/${now}/" \
-e "s/\\\$WCURL\\\$/local git repo/" \
-e "s/\\\$WCMODS.*\\\$/(true)/" \
-e "s/\\\$WCMIXED.*\\\$/(false)/" \
$entry > `echo $entry|sed -e "s/_template//"`
done
То, что я до сих пор не могу эмулировать, - это автоматическое обнаружение локальных незафиксированных изменений (на основе последней проверенной версии SVN), что делает subwcrev столь полезным.
Я заменяю $WCREV$
номером ревизии в SVN-репозитории (как сделал бы subwcrev), но на этот раз я добавляю свой сокращенный хеш git commit для идентификации скомпилированного кода. Теперь у меня вопрос: есть ли способ отличить в сценарии оболочки, отличается ли моя текущая HEAD от последней извлеченной версии SVN, чтобы я мог не добавлять часть -${gitcommit}
и устанавливать $WCMODS$
в значение false?
Если бы существовала какая-то вещь, такая как post-"git svn dcommit"
ловушка, моя проблема также была бы решена, так как с тех пор эта специальная ловушка создала бы svnversion.h по-другому. Можно ли как-то добавить такой крючок?