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

osc*_*enk 250 git macos version-control case-sensitive

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

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

fatal: renaming 'FOO' failed: Invalid argument
Run Code Online (Sandbox Code Playgroud)

好.所以我试试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)
Run Code Online (Sandbox Code Playgroud)

当我通过git add foo无变化添加目录并git commit .再次给我相同的消息.

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

Ada*_*ruk 390

您处于不区分大小写的环境中.此外,添加-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"
Run Code Online (Sandbox Code Playgroud)

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

git mv foo foo2
git mv foo2 FOO
git commit -m "changed case of dir"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 小心使用-A,因为它将以递归方式添加当前目录中的所有内容,包括未跟踪的内容.可能只是`git add foo2`会更好. (7认同)
  • 我用git mv foo foo2取得了成功; git mv foo2 FOO; git commit (5认同)
  • 那是正确的.但是,您需要分别删除foo2以及添加FOO.`-A`负责两者.反之亦然第一步.我会添加警告.谢谢! (2认同)

mip*_*adi 139

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

$ git config core.ignorecase false
Run Code Online (Sandbox Code Playgroud)

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

  • 这不起作用!在Git 1.8.3上,Git会将重命名的文件视为新文件,而不是删除+添加.提交这样的文件会使存储库有两个相同的文件,例如foo和FOO都存在!但是当结账时只出现一个文件(但是一个案例可能比另一个案例占主导地位) (5认同)
  • 我在OSX上看到了一些奇怪的行为.hrm`我修改了一个不存在的文件`.. hrm`错误:以下未跟踪的工作树文件将被checkout覆盖:`但是......那些文件不存在. (3认同)
  • 我认为这可能会在其他地方产生不良影响。不区分大小写的系统应该让 Git 认为它是同一个目录。 (2认同)
  • 我将选项添加到我的全局配置中,但它没有帮助 (2认同)

mga*_*dda 63

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

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"
Run Code Online (Sandbox Code Playgroud)


wiz*_*ons 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
Run Code Online (Sandbox Code Playgroud)

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


kon*_*yak 8

使用-f选项强制它:

git mv -f FOO foo
Run Code Online (Sandbox Code Playgroud)


Nic*_*kin 8

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

git mv -f path/to/foo/* path/to/FOO/
Run Code Online (Sandbox Code Playgroud)

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

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

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

git mv -f -n path/to/foo/* path/to/FOO/
Run Code Online (Sandbox Code Playgroud)

你做了一个mv:

  1. 提交更改
  2. 结帐任何其他修订版
  3. 退房回来.

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


Lia*_*ang 6

我有一个相关的问题。

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

$ git config core.ignorecase false
Run Code Online (Sandbox Code Playgroud)

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

相反,我做了

$ git rm -r --cached pro
$ git status // => pro files removed, new Pro files untracked
$ git add Pro
Run Code Online (Sandbox Code Playgroud)

为了使其更加安全,我在一个单独的修复分支中进行了操作,然后合并回主分支

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