неожиданный конец файла (ожидание ")"), передача команды в git filter-branch - PullRequest
0 голосов
/ 30 мая 2018

Здравствуйте, я создал скрипт для прописных имен коммитеров и изменения их адреса электронной почты.

git filter-branch --commit-filter \
'export GIT_AUTHOR_NAME=$( sed -r 's/\<./\U&/g' <<< $GIT_AUTHOR_NAME) \
export GIT_AUTHOR_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<< $GIT_COMMITTER_EMAIL) \
export GIT_COMMITTER_NAME=$( sed -r 's/\<./\U&/g' <<< $GIT_AUTHOR_NAME) \
export GIT_COMMITTER_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<< $GIT_COMMITTER_EMAIL) \
git commit-tree "$@"'

Команды sed, когда они запускаются сами по себе, работают, но в целом выдают

Rewrite e3acbe28d660ffc6ef8e9a5a79ba9bd24c3b48bd (1/22)git commit-tree:48:
git commit-tree: Syntax error: end of file unexpected (expecting ")")
could not write rewritten commit

1 Ответ

0 голосов
/ 30 мая 2018

Одинарные кавычки внутри ваших export команд читаются как синтаксические, а не литеральные.

Один из способов исправить это - установить строку команды в heredoc в кавычках и развернуть ее позже:

cmd=$(cat <<'EOF'
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 commit-tree "$@"
EOF
)

git filter-branch --commit-filter "$cmd"

<<'EOF' используется для предотвращения обработки расширений внутри heredoc до его назначения.

Обратите внимание, что export s пропало -Оболочка автоматически экспортирует любое обновление в переменную, уже присутствующую в среде, и экспортирует ее в среду перед запуском оболочки, именно так git filter-branch гарантирует, что значения доступны в первую очередь.

...