git статус после замены переменной на атрибут git чистый фильтр - PullRequest
0 голосов
/ 19 июня 2020

У меня есть небольшой 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 фиксацией?

Спасибо за ваше время!

Томас

...