У меня есть небольшой git фильтр для замены переменных, который выглядит так в .gitconfig
[filter "replace-vars"]
clean = ~/bin/git-replace-vars.sh --clean %f
smudge = ~/bin/git-replace-vars.sh --smudge %f
, а сценарий оболочки для замены выглядит так:
#!/bin/bash
mode=$1
filename=$2
if [ "$mode" = "--smudge" ]; then
# Nothing to be done since we don't want to change back the variable content changed with "--clean"
sleep 0
elif [ "$mode" = "--clean" ]; then
# called on 'git add' i.e staging, this is where we want to replace the following variables:
# $URL$, $Rev$, $Author$, $Date$
author=`git config user.name`
email=`git config user.email | sed 's/\@/\\\@/'` # make @ character properly replaceable
authorAndEmail=`echo "$author <$email>"`
# extract repository name from remote URL
repositoryName=`git remote get-url origin | perl -lne 'push @a,/\/av-repos\/(.*?)\.git/g;END{print "@a"}'`
fileNameWithRepository=`echo "$repositoryName\/$filename"`
dateTime=`date '+%Y-%m-%d %H:%M:%S %z (%a %d. %B %Y %H:%M %Z)'`
dateTimeAsRevision=`date '+%y-%m-%d %H:%M %Z'`
# replacing the variables in one go (using '!' instead of '/' in regexp for somewhat better readability)
# and mirroring the changed text back to the original file with "-i" and "tee"
perl -i -pe "
s!\\\$URL[^\\\$]*\\\$!\\\$URL: $fileNameWithRepository \\\$!g;
s!\\\$Rev[^\\\$]*\\\$!\\\$Rev: $dateTimeAsRevision \\\$!g;
s!\\\$Date[^\\\$]*\\\$!\\\$Date: $dateTime \\\$!g;
s!\\\$Author[^\\\$]*\\\$!\\\$Author: $authorAndEmail \\\$!g;
" | tee $filename
fi
Я добавил «-i» и «тройник» к perl, потому что я хотел, чтобы файл в редакторе был соответствующим образом изменен, чтобы соответствовать индексу. Пока все работает нормально.
Однако моя проблема в том, что теперь «git status» также будет указывать измененный файл как измененный.
Может ли замена быть сделана в обоих промежуточный файл и файл в редакторе без статуса git, уже сразу показывающего, что файл был изменен снова?
Я попытался получить файл непосредственно из индекса, используя
git show: $filename > $filename
в скрипте, но это запишет версию файла в индекс до текущего вызова git add.
Было бы легко, если бы сценарий оболочки мог автоматически вызываться до git add на самом деле выполняется, но это кажется невозможным.
Могу ли я как-то сказать git, что измененный файл должен считаться неизменным на данный момент (т.е. до того, как он снова будет изменен вручную)?
Или есть другие способы правильно и автоматически выполнить замену переменной перед git фиксацией?
Спасибо за ваше время!
Томас