我什么时候应该在git中使用引号?

时间:2013-07-23 19:43:43

标签: git quotes

为了举例,假设我有

Directory/
      nameOfFile.txt
      nameOfDirectory/
                ...

我一直使用格式git add Directory/nameOf*,但在不同的文档中,我看到git add 'Directory/nameOf*'

刚试过git add "Directory/nameOf*"并且它有效。

还尝试git commit -m Message with no quotes,它也有效。

那么Git是否允许可互换的报价/报价,或者只是某些情况或版本?除了它允许的内容之外,没有引号,单引号和双引号的标准协议是什么?

4 个答案:

答案 0 :(得分:2)

这个问题实际上与git以及与你的shell无关。

大多数shell使用空格“命名化”命令行 - 即将其拆分为一系列离散元素。所以,例如......

rm one file

...将尝试删除名为one的文件和名为file的文件,而...

rm 'one file'

...将尝试删除名为one file的单个文件。因此,对于您的示例,使用引号或不使用引号并不特别重要,因为您的文件名都不包含空格。唯一的例外是commit示例;如果message包含空格,则需要引用它,否则您将得到:

$ git ci -m this is a test
error: pathspec 'is' did not match any file(s) known to git.
error: pathspec 'a' did not match any file(s) known to git.
error: pathspec 'test' did not match any file(s) known to git.

事实上,另外还有一点值得考虑:引用文本通常会禁止通配符扩展,所以如果我有一个名为nameOfFile.txt的文件,我会这样做......

rm nameOf*.txt

...它会正常工作,但如果我这样做:

rm 'nameOf*.txt'

......我会收到错误:

rm: cannot remove `nameOf*.txt': No such file or directory

但是,如果shell不这样做,git实际上会执行文件名扩展,因此使用通配符的示例将起作用。

答案 1 :(得分:2)

除非你使用一些奇怪的shell,否则这些引用都不会被git看到。引号将被shell剥离。使用引号会阻止shell解释模式中的*,而不是git。在许多情况下,无论是由shell还是通过git完成这种类型的扩展都无关紧要,但有时它会在你使用git索引而不是像git rm --cached那样在文件系统上运行时。 / p>

引号还会阻止shell将空间解释为分隔参数。引用包含空格的单个参数几乎总是必要的。你提供的commit命令不起作用,而且不适合我。

通常您使用的报价类型无关紧要。最重要的情况是,如果引用的参数包含一种类型的引用,则可能更容易使用另一种类型,如果参数应该包含$,则最好使用单引号。在双引号内,您可以使用\来逃避您希望从字面上理解的"$或(另一个)\

答案 2 :(得分:0)

它基于你正在使用的shell。我只是用\

来逃避空格和其他角色

答案 3 :(得分:0)

双引号会起作用,因为shell处理它们以便你可以在文件名等中有空格。所以git add foo/bargit add "foo/bar"相同。

同样,git commit -m Foobargit commit -m "Foobar"相同。在这两种情况下,git都会将Foobar视为定义消息的单个参数。但是,如果git commit -m "foo bar"git commit -m foo bar相同,则意味着git commit -m接受多个命令行参数并将它们拼凑在一起以显示您的消息(看起来很奇怪),因为在第一种情况下,它会看到foo bar的单个消息文本参数,在第二个中,它看到单独的参数foobar