git mv,只改变目录的大小写

虽然我发现类似的问题,我没有find我的问题的答案

当我尝试重新命名目录从FOO到foo通过git mv 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 add foo没有改变和git commit . 再次给我同样的信息。

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

您处于不区分大小写的环境。 此外,添加-A不会照顾mv的删除端,因为Git了解它。 警告! 确保在执行此操作时不会出现其他更改或未跟踪的文件,否则将作为此更改的一部分提交。 首先,做到这一点,然后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" 

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

这与更正文件的名称有关: git是否不区分大小写?

你想将选项core.ignorecase设置为false,这将使Git注意不支持本机的文件系统。 要在您的回购中启用:

 $ git config core.ignorecase false 

然后你可以用git mv重命名这个文件,它可以像预期的那样工作。

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

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

强制使用-f选项:

 git mv -f FOO foo 

git mv -free变体)

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

这是一个快速和错误安全的解决scheme:

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

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

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

如果你首先想看到结果,使用-n

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

你做了一个mv

  1. 提交更改
  2. 签出任何其他修订
  3. 结账回来。

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

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

这个页面上的所有gitfoo都是一个非常简单的解决scheme。

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

提高Adam Dymitruk的答案(愚蠢,所以不让我评论他的答案),使用“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'."; 

我有一个相关的问题。

一个名为“Pro”(首先创build)和另一个“pro”(由错误创build)的文件夹。 在Mac中,它是一样的东西,但根据git不同。

 $ git config core.ignorecase false 

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

相反,我做到了

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

为了使它更加安全,我在一个特性分支中完成了,然后我合并回了主分支

对于创build的ghost文件问题,可以任何guru解释如何和为什么? 提前致谢。