Предшествующее git сообщение коммита без новой строки - PullRequest
0 голосов
/ 04 марта 2020

Я использую этот один вкладыш в prepare-commit-msg хуке, чтобы добавить к сообщению фиксации пользовательскую строку:

echo "text " | cat - $COMMIT_MSG_FILE > /tmp/out && mv /tmp/out $COMMIT_MSG_FILE

К сожалению, каждое сообщение о фиксации содержит «текст», за которым следуют CRLF и остальные зафиксировать сообщение на следующей строке. Например, если сообщение о коммите: "Commit 123", новое сообщение о коммите будет

"text
Commit 123"

, а не "textCommit 123", что я и хочу.

Любая идея, что я отсутствует

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

echo печатает новую строку. Используйте команду, которая этого не делает: это может быть echo -n, в зависимости от вашего echo года изготовления вина, или printf, если оно у вас есть, выполнит:

echo -n "text " | cat - $COMMIT_MSG_FILE > /tmp/out && mv /tmp/out $COMMIT_MSG_FILE

метод dGot14U с использованием Подстановка команды тоже работает. Также рассмотрите возможность использования на месте sed:

sed -i '' '1s/^/text /' $COMMIT_MSG_FILE

Необходим ли и когда -i отдельный аргумент для пустой строки '', как показано здесь, зависит от ОС: MacOS sed требует один, Linux sed запрещает один. Я использовал это в сценариях:

if sed --version >/dev/null 2>&1; then
    # apparently this is gnu sed, so -i requires the extension attached
    sedinplace="-i"
else
    # apparently this is BSD/MacOS sed, so -i requires a separate argument
    sedinplace="-i ''"
fi
# ...
sed $sedinplace -e cmd1 -e cmd2 $file

Затем $sedinplace расширяется до нужной вещи.

0 голосов
/ 05 марта 2020

Не передавайте свое утверждение эха коту. Вместо этого используйте подстановку команды оператора cat в вашей строке эха:

echo "text $(cat $COMMIT_MSG_FILE)" > /tmp/out && mv /tmp/out $COMMIT_MSG_FILE
...