我更改了一个目录的大小写,但Git似乎没有注意到它。

305

我正在开发一个在Git版本控制下的OS X Lion项目。一开始我的目录名是小写的,后来改为大写(例如 emailaddresses => EmailAddresses),但Git好像没有意识到这个变化。运行git ls-files和其他命令时,Git仍然认为目录名是小写的。

这会有影响吗?我该怎么做让Git识别这个变化呢?


2
可能是重复的问题:Git:更改文件名的大小写 - KyleMit
9个回答

594

您可以通过运行以下命令告诉git考虑大小写:

git config core.ignorecase false


11
如果你已经在不使用git mv --force或其他命令行脚本的情况下更改了文件名,那么这真是一个很好的答案。谢谢! - MeanMatt
13
这是优秀的答案,因为我不想手动更改200个已重命名的文件,使用git mv。 - Adam Reis
12
因为某种原因,所有的文件都被复制了一遍,现在我既有原有版本,也有大小写被改变的版本... - Salatiel
3
我猜当你已经在追踪该文件时,它会复制它们。 - Iggy
3
请注意,在不区分大小写的操作系统(Windows)中,使用此命令将在推送具有相同名称但大小写不同的文件/文件夹时产生重复的文件/文件夹。 - rick
显示剩余10条评论

321

你可能正在使用大小写不敏感(但保留大小写)的HFS+文件系统。我通常会这样解决这个问题:

$ git mv somename tmpname
$ git mv tmpname SomeName

3
我曾在Github for Windows工具中遇到相同的问题。同样,上述解决方案可以很好地解决此问题:在Windows资源管理器中将文件重命名为临时文件,然后提交后再将其重命名为正确大小写的最终文件名。 - Jason
16
或者使用一条命令:git mv --force somename SomeName (来源:https://dev59.com/5Wkv5IYBdhLWcg3wiRWo#16071375)。 - jackocnr
2
为了使更改反映在远程存储库中,您还需要执行 git push origin master。如果 git 拒绝更新远程存储库,则可能需要添加一个虚拟文件(例如 touch stam)并进行推送。然后再删除 stam 并再次推送。 - Rahav
2
@SagunKho:尝试使用git mv --force somename SomeName代替。 - Paul R
2
需要注意的一点是,您需要在文件所在的文件夹中才能使此命令正常工作。一开始我并没有意识到这一点,因为我试图从存储库的根目录运行命令,结果一直出现“>>> bad source, source=somename, destination=tmpname <<<”。 - Parth
1
即使使用 --force 也无法工作,因为 Git 说文件不存在。 - Taimoor Ahmad

44

如何在 Mac 上对文件进行大小写敏感的 git mv 操作

这是因为 Mac OS X 实现了区分大小写和不区分大小写的功能,旨在帮助您。

虽然其他答案中的双重重命名建议可以起作用,但我建议使用“--force”以获得最佳实践结果:

$ git mv --force somename SomeName

注意:如果您在不使用强制选项的情况下尝试,git会像这样拒绝您:


$ git mv somename SomeName
$ fatal: destination exists, source=somename, destination=SomeName

在上述示例中,git命令失败,并且文件系统或git索引中没有更改的文件。


在第一条命令中,我收到了“致命错误:未处于版本控制下”的提示。 - 2540625
那个致命错误意味着你在那个位置没有GIT存储库。 git 命令只能在具有GIT存储库的目录中使用。 - David Manpearl
但是我在我的Git存储库的子目录中...最后,我通过Taran的答案解决了这个问题。顺便说一句,谢谢。 - 2540625

26

尝试在你的 .gitconfig 文件中将 git 配置选项 core.ignorecase 更改为 false。


8
可以使用以下命令:git config core.ignorecase false - iforgotmypassword
2
@iforgotmypassword = 你应该回答它的 - 实际上我会投票给你的 - Abdeali Chandanwala

21
以下步骤帮助我解决了问题:
  1. 将文件夹重命名为 temp

    mv Folder temp                  // It will rename your Folder to temp
    
  2. 暂存和提交:

  3. git add .
    git commit -m "Temp"
    
  4. temp文件夹重命名为您选择的名称:

    mv temp folder        // It will rename temp folder to the name of your choice(folder)
    git add .
    git commit -m "Folder Fixed"
    
    完成 - 您现在可以推送。

2
它运行得非常好。非常感谢。 - Quang Khải Đàm
您也可以在第一次提交之前完成此操作;只需重命名、暂存、重命名、暂存,然后提交即可。 - Phoenix

7
这是因为基于LINUX的操作系统或macOS忽略文件/文件夹名称的大小写区分。我们需要通过以下步骤解决此问题。
For Exp, you want to change folder name from Base to base
1. mv Base base2
2. git add . && git commit -m "Fix folder name problem (wip)"
3. mv base2 base
4. git add . && git commit -m "Fixed folder name problem"

4
如果你执行git mv AAA aaagit mv -f AAA aaa,它将不起作用,并出现错误fatal: renaming 'AAA' failed: Invalid argument
因为在大小写不敏感的文件系统上,AAAaaa是同一个文件夹/文件,将AAA移动到aaa意味着将AAA移动为aaa/AAA
所以你应该这样做:
git mv AAA aaa.1
git mv aaa.1 aaa

我希望这对你有所帮助。


1

这些方法都没有帮助我,因为我的情况是本地文件夹大小写不一致,而远程文件夹大小写一致,我的分支落后了,无法拉取,因为文件夹结构中的大小写差异。

唯一的解决方法是删除本地分支,然后检出远程分支。


-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接