【问题标题】:Using git mv and avoid fatal source/destination error使用 git mv 并避免致命的源/目标错误
【发布时间】:2019-01-29 06:04:51
【问题描述】:

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

必须有一个非常简单的方法来做到这一点。然而,作为一个初学者,我被困住了。

【问题讨论】:

    标签: git shell terminal move


    【解决方案1】:

    这与 Git 本身无关,与您的文件名与外壳有关。

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

    $ 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 看到引号并知道空格不应该 用于分隔参数。 Shell 删除引号并将(单个)参数 Coin Toss.lvproj 传递给命令。

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

    $ git mv "Coin Toss.lvproj" Basics
    

    你可以保护每个字:

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

    shell 会尽职尽责地确保 mv 是一个词(去掉引号)并且 Basics 也是一个词,但这不是必要的,因为两个词都不包含空格.

    (这就是为什么在类 Unix 系统上不经常使用嵌入空格的文件名的原因:它们不方便,因为它们在使用 shell 时需要某种引用。)

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

    $ git mv Coin\ Toss.lvproj Basics
    

    并且一些操作,例如使用文件名完成,会自动完成。

    【讨论】:

    • 谢谢你的详细解释:)
    • 在这种情况下,一次移动一个文件是唯一的选择吗?
    • 不:你可以git mv "file one" "file two" "file three" Basics,甚至git mv *.lvproj Basics。 shell 将扩展*.lvproj,它会在分词之后但在运行命令之前执行此操作。 (请注意,如果您的文件名称中包含 *,则必须引用 * 以防止 shell 进行扩展。完整的规则变得相当复杂:某些类型的引号会阻止某些扩展,而不是其他类型的扩展。)
    猜你喜欢
    • 2017-01-13
    • 2019-08-04
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多