Git mv,只更改目录的大小写

虽然我发现类似的问题,但我没有找到我的问题的答案

当我尝试通过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),为什么我不能简单地重命名目录?

100162 次浏览

你不会在OS X中使用区分大小写的文件系统,除非你明确地选择这样做。HFS+ 可以是区分大小写的,但默认是不区分大小写的。

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

$ git config core.ignorecase false

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

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

这是改变工作目录的拉长方式,提交然后折叠两次提交。您可以在索引中移动文件,但是对于git的新手来说,它可能不够明确地说明发生了什么。简短的版本是

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

正如其中一条评论所建议的那样,你也可以做一个交互式的rebase (git rebase -i HEAD~5,如果在5次提交之前引入了错误的case)来修复那里的case,并且在历史记录中根本不会出现错误的case。如果你这样做,你必须小心,因为从那时起提交哈希将是不同的,其他人将不得不重新建立或重新合并他们的工作与最近的过去的分支。

这与纠正文件名有关:git不区分大小写吗?

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

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

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

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

使用-f选项强制执行:

git mv -f FOO foo

这里有一个关于这个页面上所有gitfoo的非常简单的解决方案。

  1. 手动从项目中复制文件。
  2. Git rm所有文件。
  3. Git像正常一样提交。
  4. 手动重新添加文件。
  5. Git添加所有文件。
  6. Git像正常一样提交。
  7. 利润。

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

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应该在内部文件和文件系统中都重命名了文件夹。

我有一个相关的问题。

一个文件夹名为“Pro”(先创建的),另一个名为“Pro”(错误创建的)。在Mac中,这是同样的事情,但根据git不同。

$ git config core.ignorecase false

git配置将文件重命名到正确的文件夹(谢谢),并在“pro”中创建了幽灵文件(不!!)我不能添加鬼文件更改轨道,我不能签出其他分支,除非携带这些文件与我,我也不能以某种方式重置它。

相反,我做了

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

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

对于鬼文件问题,有大师能解释一下为什么? 提前谢谢你。< / p >

这对我来说在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

感谢Adam的回答。

这里有一个简单的方法。

  1. 确保你的工作目录为空。

  2. 暂时禁用git忽略大小写

git config core.ignorecase false
  1. 重命名任何目录(例如Folder =>文件夹)
  2. 向工作目录添加更改
git add --all
  1. 保存您的更改。
git stash
  1. 原来的目录现在应该被删除。进行本地提交。
git add --all
git commit -m "Rename directories"
  1. 流行的变化
git stash pop
  1. 将此修改为之前的提交。
git add --all
git commit --amend
  1. 您现在应该有一个重命名目录的提交。你现在可以恢复原来的ignorecase配置:
git config core.ignorecase true