使用git mv并避免致命的源/目标错误

时间:2018-08-22 22:24:34

标签: git shell terminal move

事实git mv用于移动/重新命名会引起一些问题。我当前的状态如下:

wireless-10-104-40-80:UMD-LabVIEW-Boot-Camp deepayanbhadra$ ls
AND Gate.lvproj             Integer Detector.lvproj
Account Balance.lvproj          Integer Parity Detector.lvproj
Basics                  LICENSE
Coin Toss.lvproj            Palindromic Word Detector.lvproj
Convert Temperature.lvproj      README.md

在这里,Basics是一个文件夹/目录,其余是文件。我想将所有文件移到Basics文件夹中。在咨询了一些SO帖子之后,我尝试了此操作并出现了错误:

wireless-10-104-40-80:UMD-LabVIEW-Boot-Camp deepayanbhadra$ git mv Coin Toss.lvproj Basics
fatal: bad source, source=Coin, destination=Basics/Coin

必须有一种非常简单的方法来执行此操作。但是,作为一个初学者,我被困住了。

1 个答案:

答案 0 :(得分:1)

这与Git本身无关,与文件名和外壳程序无关。

当您在外壳程序的命令行(开始键入之前以$结尾的行)中输入命令时,外壳程序本身会将命令分解为一系列自变量单词使用空格作为默认值:

$ word1     word2 word3    word4
例如

变成四个单词,而不管每个单词之间的间距如何。

此包含四个单词的向量随后被视为命令,第一个单词为命令的名称,其余三个为参数。如果该命令为echo,则只需打印回其每个参数:

$ echo    A           B C         D
A B C D

请注意,echo在每个单词之间打印一个空格。如果该命令为wc,则wc命令将每个参数视为文件名,并尝试打开该文件:

$ wc A B C D
wc: A: No such file or directory
wc: B: No such file or directory
wc: C: No such file or directory
wc: D: No such file or directory
0 0 0 total

如果您想计算名为Coin Toss.lvproj的文件中的单词并运行:

$ wc Coin Toss.lvproj

wc命令将看到两个单独的参数:CoinToss.lvproj,并尝试打开两个单独的文件。 两个文件都不存在,因此该命令将以与A B C D相同的方式失败。

您必须说服 shell 将字符串Coin Toss.lvproj作为一个单独的参数发送。有很多方法可以做到这一点。最简单的是使用引号:

$ wc "Coin Toss.lvproj"

shell 处看到引号,并知道应使用 not 空格分隔各个参数。该外壳程序删除引号,并将(单个)参数Coin Toss.lvproj传递给命令。

git命令将要运行的子命令作为其第一个参数。然后,子命令mv使用一个或多个源文件名以及目标目录名,或者(如果给定了一个源文件名)目标文件名。因此,再次必须保护文件名Coin Toss.lvproj中的空格,您可以使用相同的方法进行操作:

$ git mv "Coin Toss.lvproj" Basics

您可以保护每个单词:

$ git "mv" "Coin Toss.lvproj" "Basics"

并且外壳将尽职地确保mv是一个单词(去掉引号),并且Basics也是一个单词,但这不是不必要,因为这两个单词包含空格。

(这就是为什么在类似Unix的系统上很少使用带有空格的文件名的原因:它们不方便,因为使用外壳程序时它们需要某种引号。)

shell中还有许多其他形式的引用,包括使用反斜杠前缀:

$ git mv Coin\ Toss.lvproj Basics

和某些操作(例如使用文件名完成)将自动执行此操作。