git ошибка фиксации: pathspe c 'xxx' не соответствует ни одному файлу (ам), известному git - PullRequest
0 голосов
/ 29 мая 2020

Я написал сценарий bash для автоматического обновления моих файлов через git, но я продолжаю получать ошибку для строки git фиксации, если мое сообщение содержит ошибку.

Я уже упаковал свои сообщение с цитатой, что здесь не так?

Мой bash скрипт:

##Handle local git update
remote='
cd express-demo-nonbare;
git pull origin master;
';

echo "Process for updating Git begin";
git add . ;
read -p "Message for this commit: " comment;
comment=\"${comment}\";
echo $comment;
git commit --message=$comment;
git push backup master;

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

На самом деле вам просто нужно указать переменную comment при передаче ее в git commit. Вы можете заменить:

read -p "Message for this commit: " comment;
comment=\"${comment}\";
echo $comment;
git commit --message=$comment;

на

read -p "Message for this commit: " comment;
echo $comment;
git commit --message="$comment";

Котировки не будут частью сообщения фиксации, скорее они будут использованы bash, чтобы гарантировать, что все содержимое Переменная comment передается как часть единственного аргумента --message=... в git, даже если она содержит символы пробела.

1 голос
/ 29 мая 2020

Вы не хотите, как вы выразились:

обернуть ... мое сообщение цитатой

(что вы действительно делаете) . Вместо этого вы хотите защитить свое сообщение от того, чтобы bash рассматривал его как список слов . Для этого вам нужны кавычки, но в другой позиции:

remote='
cd express-demo-nonbare;
git pull origin master;
'

echo "Process for updating Git begin"
git add .
read -p "Message for this commit: " comment
echo "$comment"
git commit --message="$comment"
git push backup master

Я также удалил все второстепенные точки с запятой (bash обрабатывает конец строки как конец команды, если только что-то вроде незакрытой круглой скобки или фигурной скобки предотвращает это).

Мне не ясно, каково ваше намерение установить переменную remote в буквальную строку новая строка c d пробел e x ... ; новая строка , особенно поскольку $remote не встречается позже в сценарии. Обратите внимание, однако, что, поскольку эта строка включает пробел, расширение ее за пределы кавычек, как в $remote (против "$remote", которое расширяет ее внутри кавычек), может запускать дальнейшие действия оболочки. Например:

foo='this; that'
wc $foo

программа wc попытается открыть файлы с именами this; и that, разделив $foo в пробелах на отдельные слова, которые затем передаются в wc. Это разделение фактически основано на $IFS:

IFS=+
foo='this+that'
wc $foo

пытается открыть файлы с именами this и that. Восстановление нормального значения IFS:

wc $foo

пытается открыть один файл с именем this+that.

(я иногда использую wc в качестве программы, чтобы показать, каковы были фактические аргументы , поскольку он пытается открыть каждый из них как имя файла и выдает фактическое имя файла в любом последующем сообщении об ошибке или количестве.)

Аналогично, если раскрытие переменной производит метасимволы глобуса оболочки, они будут будет оцениваться после расширения:

foo='*'
wc $foo

будет пытаться открыть и прочитать каждый файл и каталог в текущем каталоге. Опять же, двойные кавычки защитят от этого:

wc "$foo"

будет пытаться открыть и прочитать только один файл с именем *.

...