git commit错误:pathspec'xxx'与git已知的任何文件都不匹配

问题描述 投票:0回答:1

我编写了一个bash脚本来通过git自动更新文件,但是如果我的消息包含错误,我会在git commit行中不断收到错误。

我已经用引号包裹了我的消息,这是怎么了?

我的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;
bash git git-bash
1个回答
1
投票

确实,在将comment变量提供给git commit时,只需要引用该变量即可。您可以替换:

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

with

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

引号不会成为提交消息的一部分,而是由bash使用,以确保comment变量的全部内容作为--message=...的单个git参数的一部分提交,甚至如果包含空格字符。


1
投票

您不想那样说:

包装...我的报价单消息

(确实是您正在做的事情。相反,您希望保护您的消息免遭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设置为文字字符串newline c d space e x ... ; newline,尤其是因为$remote不会在脚本的后面出现。但是请注意,由于此字符串的确包含空格,因此将其扩展为[[outside引号,例如$remote(vs "$remote"将其扩展为引号内)可以触发进一步的shell操作。例如:

foo='this; that' wc $foo
将使wc程序尝试打开名为this;that的文件,将空白处的$foo拆分为单独的单词,然后将其传递给wc。该拆分实际上基于$IFS

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

尝试打开名为thisthat的文件。将IFS恢复到其正常设置:

wc $foo

尝试打开一个名为this+that的文件。

((我有时使用wc作为程序来帮助显示实际的参数,因为它试图将每个参数作为文件名打开,并在随后的任何错误消息或计数中吐出实际的文件名。)] >

类似地,如果变量的扩展产生了外壳球状元字符,则将在扩展后对其进行求值:

foo='*' wc $foo

将尝试打开并读取当前目录中的每个文件和目录。同样,双引号可以防止这种情况:

wc "$foo"

只会尝试打开并读取一个名为*的文件。
© www.soinside.com 2019 - 2024. All rights reserved.