Прежде всего, вашему --env-filter
не нужно звонить git commit-tree
.Нужно только обновить среду.
Помимо этого, проблема заключается в синтаксисе сценария вашей оболочки.Когда вы говорите
cmd=$(
GIT_AUTHOR_NAME=$(sed -r 's/\<./\U&/g' <<<"$GIT_AUTHOR_NAME")
GIT_AUTHOR_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<<"$GIT_COMMITTER_EMAIL")
GIT_COMMITTER_NAME=$(sed -r 's/\<./\U&/g' <<<"$GIT_AUTHOR_NAME")
GIT_COMMITTER_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<<"$GIT_COMMITTER_EMAIL")
)
Это означает, что нужно немедленно запустить
GIT_AUTHOR_NAME=$(sed -r 's/\<./\U&/g' <<<"$GIT_AUTHOR_NAME")
GIT_AUTHOR_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<<"$GIT_COMMITTER_EMAIL")
GIT_COMMITTER_NAME=$(sed -r 's/\<./\U&/g' <<<"$GIT_AUTHOR_NAME")
GIT_COMMITTER_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<<"$GIT_COMMITTER_EMAIL")
и установить переменную cmd
для вывода этих команд.
I'mЯ не уверен, что создание сценария фильтра в переменной - это то, что я хотел бы сделать, но если это так, как вы хотите, это будет работать лучше
cmd='GIT_AUTHOR_NAME=$(sed -r "s/\<./\U&/g" <<<"$GIT_AUTHOR_NAME");
GIT_AUTHOR_EMAIL=$(sed "s/@[^,]*/@foo.net/" <<<"$GIT_COMMITTER_EMAIL");
GIT_COMMITTER_NAME=$(sed -r "s/\<./\U&/g" <<<"$GIT_AUTHOR_NAME");
GIT_COMMITTER_EMAIL=$(sed "s/@[^,]*/@foo.net/" <<<"$GIT_COMMITTER_EMAIL");'
git filter-branch --env-filter "$cmd"
Обратите внимание на измененные кавычки ('...'
вместо$(...)
для скрипта в целом; "
вместо '
в скрипте, потому что нет смысла прыгать через обручи, чтобы использовать '
там) и добавленные ;
s
Обновление - Чтобы прояснить для потомков - синтаксис, который я предлагаю выше, был протестирован в системе Windows, работающей git bash
.Синтаксис сценария в исходном вопросе напоминал синтаксис bash, и bash был бы типичным для среды git, поэтому я предположил, что это так.
Из комментариев кажется, что OP использовал что-то другое (я до сих пор не знаю,что) это не может обработать этот синтаксис;но обнаружил, что предложенный синтаксис также работает в zsh.