首页 文章

git mv并且只更改目录的大小写

提问于
浏览
231

虽然我发现类似question但我找不到问题的答案

当我尝试通过 git mv FOO foo 将目录从FOO重命名为foo时,我得到了

fatal: renaming 'FOO' failed: Invalid argument

好 . 所以我试试 git mv FOO foo2 && git mv foo2 foo

但当我尝试通过 git commit . 提交时,我得到了

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# foo
nothing added to commit but untracked files present (use "git add" to track)

当我通过 git add foo 添加目录时,没有任何更改, git commit . 再次给我相同的消息 .

我究竟做错了什么?我以为我使用区分大小写的系统(OSX)为什么我不能简单地重命名目录?

10 回答

  • 358

    您处于不区分大小写的环境中 . 此外,添加 -A 将不会处理 mv 的删除方面,因为Git理解它 . Warning! Ensure that no other changes or untracked files are around when you do this or they will get committed as part of this change! git stash -u 首先,执行此操作然后 git stash pop . 继续:要解决此问题,请执行以下操作:

    mv foo foo2
    git add -A
    git commit -m "renaming"
    mv foo2 FOO
    git add -A
    git commit --amend -m "renamed foo to FOO"
    

    这是改变工作目录,提交然后折叠2次提交的方法 . 你可以只在索引中移动文件,但对于git新手的人来说,它可能不够明确到底发生了什么 . 较短的版本是

    git mv foo foo2
    git mv foo2 FOO
    git commit -m "changed case of dir"
    

    正如其中一条评论中所建议的那样,你也可以做一个交互式的rebase( git rebase -i HEAD~5 ,如果错误的情况是在5次提交之前引入的),以便在那里修复案例并且没有错误的案例出现在历史的任何地方 . 如果你这样做,你必须要小心,因为从那时起提交哈希将是不同的,而其他人将不得不将他们的工作重新组合或重新合并到最近的分支 .

    这与更正文件名有关:Is git not case sensitive?

  • 7

    您希望将选项 core.ignorecase 设置为false,这将使Git关注本机不支持它的文件系统上的大小写 . 要在您的回购中启用:

    $ git config core.ignorecase false
    

    然后,您可以使用 git mv 重命名该文件,它将按预期工作 .

  • 8

    我能够通过使用临时文件名使用git 1.7.7来解决这个问题:

    $ git mv improper_Case improve_case2
    $ git mv improve_case2 improve_case
    $ git commit -m "<your message>"
    
  • 1

    git mv -免费版本 . )

    我在Mac OS X 10.9上的Git中遇到了这个问题 . 我解决了如下:

    git rm -r --cached /path/to/directory

    这将在Git中删除目录,但实际上并没有删除任何物理文件( --cached ) . 这也使得现在具有正确情况的目录显示在未跟踪的文件中 .

    所以你可以这样做:

    mv /path/to/directory /path/to/DIRECTORY
    git add -A /path/to/DIRECTORY
    

    然后Git会识别出你已经重命名了文件,当你执行 git status 时,你会看到许多 renamed: 行 . 检查它们并确保它们看起来正确,如果是这样,您可以正常提交更改 .

  • 55

    使用-f选项强制它:

    git mv -f FOO foo
    
  • 131

    这是一个快速且错误安全的解决方案:

    git mv -f path/to/foo/* path/to/FOO/
    

    警告!始终重命名重命名的文件夹中的所有文件(使用/ *) .

    不要重命名单个文件 . 这导致了一个错误,在answer中描述 .

    如果您首先想要查看结果,请使用 -n

    git mv -f -n path/to/foo/* path/to/FOO/
    

    在你做了 mv 之后:

    • 提交更改

    • 结帐到任何其他修订版

    • 退房 .

    现在Git应该在其内部文件和文件系统中重命名文件夹BOTH .

  • 2

    除非您明确选择,否则您不会在OS X中使用区分大小写的文件系统 . HFS可以区分大小写,但默认情况下不区分大小写 .

  • 0

    我有一个相关的问题 .

    一个名为'Pro'的文件夹(先创建)和另一个'pro'(错误创建) . 在Mac中,它是相同的,但根据git不同 .

    $ git config core.ignorecase false
    

    git config将文件重命名为正确的文件夹(谢谢),还在'pro'中创建了ghost文件(No !!) . 我无法将鬼文件更改添加到轨道,我无法检查其他分支,除非随身携带那些文件,我也无法以某种方式重置它 .

    而不是那样,我做到了

    $ git rm -r --cached pro
    $ git status // => pro files removed, new Pro files untracked
    $ git add Pro
    

    为了使它更安全,我在一个单独的修复分支中完成它,然后我合并回主分支

    对于创建的ghost文件问题,任何大师都可以解释How和Why?提前致谢 .

  • 13

    Here's a really simple solution around all the gitfoo on this page.

    • 手动将文件复制出项目 .

    • git rm所有文件 .

    • git提交正常 .

    • 手动添加文件 .

    • git添加所有文件 .

    • git提交正常 .

    • 利润 .

  • 2

    改善Adam Dymitruk的答案(愚蠢的是,SO不让我评论他的答案),使用“git mv”将自动准确移动文件 . 不需要存储,可以避免风险的“git add -A”:

    old="abc";    new="ABC";
    tmp="$old-renamed";
    git mv "$old" "$tmp";
    git commit -m "Renamed '$old' to '$tmp'.";
    git mv "$tmp" "$new";
    git commit --amend -m "Renamed '$old' to '$new'.";
    

相关问题