使用 git mv 并避免致命的 source/destination 错误

Using git mv and avoid fatal source/destination error

事实上 git mv 用于两个 moving/renaming 导致了一些问题。我目前的状态是这样的:

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是一个folder/directory,其余都是文件。我想将所有文件移动到 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

一定有一种非常简单的方法可以做到这一点。然而,作为初学者,我被卡住了。

这与 Git 本身无关,与您的文件名和 shell.

无关

当您在 shell 的命令行中输入命令时(开始输入前以 $ 结尾的行),shell 本身会将命令分解成一系列参数词,默认使用白色-space:

$ word1     word2 word3    word4

例如变成四个单词,不管每个单词之间的 space 数量。

然后将这个包含四个单词的向量视为命令,第一个单词是命令的名称,其余三个单词作为参数。例如,如果命令是 echo,它会简单地打印回它的每个参数:

$ echo    A           B C         D
A B C D

请注意,echo 在每个单词之间打印一个 space。例如,如果命令是 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看到引号就知道space应该单独的参数。 shell 删除引号并将(单个)参数 Coin Toss.lvproj 传递给命令。

git 命令将 运行 的子命令作为其第一个参数。子命令 mv 然后采用一个或多个源文件名和目标目录名,或者(如果给定一个源文件名)目标文件名。所以再一次,你必须保护文件名中的空白Coin Toss.lvproj,你可以这样做同样的方法:

$ git mv "Coin Toss.lvproj" Basics

你可以保护每个字:

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

和 shell 会尽职尽责地确保 mv 是一个词(去掉引号)并且 Basics 也是一个词,但那不是 必要 因为两个词都不包含白色-space.

(这就是为什么带有白色 space 的文件名在类 Unix 系统上使用得不多:它们 不方便 因为它们需要某种引用当使用 shell.)

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

$ git mv Coin\ Toss.lvproj Basics

有些操作(例如使用文件名补全)会自动执行此操作。