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

时间:2010-06-10 04:26:41

标签: macos git version-control case-sensitive

虽然我发现了类似的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)为什么我不能简单地重命名目录?

11 个答案:

答案 0 :(得分:378)

您处于不区分大小写的环境中。此外,添加-A将不会照顾mv的删除方,因为Git理解它。 警告!确保在执行此操作时没有其他更改或未跟踪的文件,或者它们将作为此更改的一部分提交! 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"

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

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

答案 1 :(得分:137)

您希望将选项core.ignorecase设置为false,这将使Git关注本机不支持它的文件系统上的案例。要在您的仓库中启用:

$ git config core.ignorecase false

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

答案 2 :(得分:56)

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

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

答案 3 :(得分:13)

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:行。检查它们并确保它们看起来正确,如果是这样,您可以正常提交更改。

答案 4 :(得分:8)

使用-f选项强制它:

git mv -f FOO foo

答案 5 :(得分:8)

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

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

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

不要重命名单个文件。这导致了一个错误,如answer中所述。

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

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

在您制作mv之后:

  1. 提交更改
  2. 结帐至任何其他修订
  3. 退房。
  4. 现在Git应该在其内部文件和文件系统中重命名文件夹BOTH。

答案 6 :(得分:2)

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

答案 7 :(得分:2)

我有一个相关的问题。

一个名为&#39; Pro&#39; (先创建)和另一个&#39; pro&#39; (错误地创建)。在Mac中,它是相同的,但根据git不同。

$ git config core.ignorecase false

git config将文件重命名为正确的文件夹(谢谢),并在&#39; pro&#39;中创建了ghost文件。 (没有!!)。我无法在轨道上添加ghost文件更改,除非随身携带那些文件,否则无法检查其他分支,我也无法以某种方式重置它。

而不是那样,我做了

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

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

对于创建的ghost文件问题,任何大师都可以解释如何以及为什么? 提前致谢。

答案 8 :(得分:1)

这是围绕此页面上所有gitfoo的一个非常简单的解决方案。

  1. 手动将文件复制出项目。
  2. git rm所有文件。
  3. git就像正常一样提交。
  4. 手动添加文件。
  5. git添加所有文件。
  6. git就像正常一样提交。
  7. 利润。

答案 9 :(得分:0)

改善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'.";

答案 10 :(得分:0)

这在Windows上对我非常有用。将powershell与以下内容一起使用:

  1. mv .\Folder-With-Wrong-Casing .\temp
  2. git add -A
  3. git commit -m "renamed folder with wrong casing to temp"
  4. mv .\temp .\Folder-with-Correct-Casing
  5. git add -A
  6. git commit --amend -m "Renamed to proper casing"
  7. (可选)git push

感谢亚当的上述回答。