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

当我尝试重命名目录从FOO到FOO通过git mv FOO FOO我得到

fatal: renaming 'FOO' failed: Invalid argument

好的。我试试gitmv FOO foo2 && gitmv 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添加目录时,添加foo没有任何变化,git提交。又给了我同样的信息。

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


当前回答

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

手动从项目中复制文件。 Git rm所有文件。 Git像正常一样提交。 手动重新添加文件。 Git添加所有文件。 Git像正常一样提交。 利润。

其他回答

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

手动从项目中复制文件。 Git rm所有文件。 Git像正常一样提交。 手动重新添加文件。 Git添加所有文件。 Git像正常一样提交。 利润。

您所处的环境不区分大小写。此外,不带-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忽略大小写

git config core.ignorecase false

重命名任何目录(例如Folder => Folder) 向工作目录添加更改

git add --all

保存您的更改。

git stash

原来的目录现在应该被删除。进行本地提交。

git add --all
git commit -m "Rename directories"

流行的变化

git stash pop

将此修改为之前的提交。

git add --all
git commit --amend

您现在应该有一个重命名目录的提交。你现在可以恢复原来的ignorecase配置:

git config core.ignorecase true

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

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