我把一些文件的名字改成了首字母不大写,如在Name.jpg中改为Name.jpg。Git无法识别这些更改,我必须删除这些文件并重新上载。在检查文件名的更改时,Git是否有区分大小写的方法?我没有对文件本身做任何更改。
- @如果这不太正确,Git实际上有一个配置设置控制它是否忽略大小写敏感度。
- 可能重复的是git不区分大小写?
- 参见stackoverflow.com/a/24979063/6309:由于git 2.0.1,一个简单的git mv工作。
- Git的可能副本:更改文件名的大小写
- 参考这篇文章。我可以提交,但只使用git commit-m"msg",而不使用任何文件路径作为参数。它更新了索引并签入了文件。[链接]stackoverflow.com/questions/35790113/…
- 在其他一切努力之后,我想出了一个非常简单的解决方案。将其重命名为"a",提交,然后将其重新命名为您首先希望它是什么。
- @NIF只是想添加(几年后;)HFS可以区分大小写,但默认情况下不区分大小写。我有一个单独的65 gib分区,格式为区分大小写的hfs,用于我的git工作副本。我要承认,我的理智很差…
- 您需要启用区分大小写的git config core.ignorecase false。
您可以使用git mv:
1
| git mv -f OldFileNameCase newfilenamecase |
- 这给我的源目录是空的而不是
- 致命错误:不加"文件"file.svg file.svg别名"中已经存在一个指数)[在webstorm工作精细,但在CLI)
- 我想这和fatal: renaming '...' failed: File exists。我做在Ubuntu的虚拟机,它运行在OSX
- 在使用MacOS(不区分大小写(FS)和工作!谢谢。
- "如果你有wisestrawberry空间在文件路径,它在缠绕在引号。
- 在最近的版本,你不再需要的-f旗。
- 不要忘了给文件的全路径。显而易见的,我知道,但我有一会儿
- 作为替代wisestrawberry退房,这可能给"源目录是空的"错误当应用到文件夹的根目录中的一样。(subfolders似乎工作精细)
- 这不是我的工作,我想在一个目录重命名一个文件路径(failed: Invalid argument)全没有。怪怪的。
- 戴蒙@因为你这是第一mved目录(没有GIT),所以现在你试图使它通过git mvGit知道吗?本stackoverflow.com湖:/ / / 786559 27139487
- 不要这么认为……但好的主意!我来移动它,移动它,然后删除规则A反馈和重新添加它。但不能有其他任何工作
- 你不能把一个git mv目录。你需要做的每个文件的目录如果你想修改案例A目录名称。
- strangely不够,把这一工作在Mac OS,不得不将一个给定的文件的第一个testcase.ts到testcasesomething.ts,提交它,那么它就是正确的,效果是最终提交testcase.ts before a和推。
- 一个顶级评为评论:你需要一个新的Git -f开关(2.18),否则你可能会fatal: destination exists错误。
Git的配置设置告诉它是区分大小写还是不区分大小写:core.ignorecase。要告诉Git区分大小写,只需将此设置设置为false:
1
| git config core.ignorecase false |
文档
从git config文件中:
core.ignorecase
If true, this option enables various workarounds to enable git to work better on filesystems that are not case sensitive, like FAT. For example, if a directory listing finds makefile when git expects Makefile, git will assume it is really the same file, and continue to remember it as Makefile.
The default is false, except git-clone(1) or git-init(1) will probe and set core.ignorecase true if appropriate when the repository is created.
不区分大小写的文件系统
我所知道的两个最流行的具有不区分大小写的文件系统的操作系统是
- 这是一个很好的答案,对我很有用,但是在这样做时要小心,因为它会改变您的生产环境。所以在做这个改变之前要仔细考虑一下。
- 结果发现这在项目中是默认启用的。生活确实有点有趣。
- 看起来你必须为你拥有的每个Git存储库做这件事。如何将其设置为全局?
- 另一方面,我不认为MacOSX本身是不区分大小写的。相反,决定区分大小写的是文件系统。格式化hfs+分区时,用户可以选择是区分大小写还是不区分大小写。默认情况下不区分大小写。
- 在这个答案中似乎非常值得注意的是,在不区分大小写的文件系统上将这个选项设置为false是一个坏主意。这不一定很明显。例如,我刚在Mac上尝试了这个方法,认为它可以解决我的问题,然后将一个文件从productPageCtrl.js重命名为productPageCtrl.js。git status看到一个新的文件,名为productPageCtrl.js,但不认为productPageCtrl.js已被删除。当我添加新文件、提交并推送到Github时,Github回购现在包含了这两个文件,尽管我的(据说是最新的)本地回购只有一个。
- @Markamery听起来很像Git客户机中的bug。你提交报告了吗?
- 这对我的情况非常有效。我在Visual Studio中重命名了三个类,并且知道名称更改发生在文件系统中,但是直到创建了一个拉请求,并且文件仍然存在与以前相同的丢失案例问题,我才注意到更改没有发生在Git中。
- @domi这不是bug,这是预期行为。事实上,在不敏感的文件系统上将其设置为false是一个坏主意,因为这就是所发生的事情。Git没有看到小写文件被删除的原因是文件系统没有报告它被删除,因为它忽略了这个情况,而Git没有将这个选项设置为false。不是文件名在NTFS或FAT上没有大小写对比,只是文件名查找忽略了大小写。
- @从用户的角度来看,这仍然是一种不成熟的感觉,因为你希望你的Git客户端足够聪明来处理这个问题。但是,同样,Linux并不以试图使事物变得用户友好而著称,而是以其强大而著称。
- @多米吉特足够聪明。这就是为什么在不区分大小写的文件系统上不应该将其设置为false的原因。使用git mv移动文件,并查看Git如何管理它。如果您移动没有git的文件,那么git就不能做任何事情,因为文件系统没有告诉git真相。这是一个关于ntfs/fat/hfs之类的问题,而不是git/linux。
- 这对本地git回购有效,但在推后似乎没有效果。
- @Mark Amery我发现git config core.ignorecase false在Mac上是无用的。我必须用另一个工具包装git push/pull/checkout/status来解决这个git bug。
- @哦,这对我来说确实像个虫子,如果它是这样的话。很容易将标志FILE_FLAG_POSIX_SEMANTICS传递给方法,以使用文件的区分大小写的名称验证文件是否存在。如果设置了此标志,将找不到文件。另外,对于find文件,可以使用FileFirstFileEx和FIND_FIRST_EX_CASE_SENSITIVE。参考资料:mathematica.stackexchange.com/questions/97734/…msdn.microsoft.com/en-us/library/windows/desktop/…
- 在Windows 10上不适合我
- 在Windows10,Gitkraken客户端上为我工作得很好。
- 在设置为false之前,可以添加如何检查默认值的方法吗?谢谢!
- 文章应该被编辑,包括这里提到的各种警告。因此我浪费了很多时间。
- 这应该是我正确的A.I.R.
这就是我在OS X上所做的:
1 2
| git mv File file.tmp
git mv file.tmp file |
两个步骤,因为否则我会得到一个"文件存在"错误。也许可以通过添加--cached等一步来完成。
- 正如最上面的答案所表明的,你要找的旗帜是-f部队。
- rperryng @号,-f旗不帮助个案优先FS是大小写不敏感的。然而,两步解决方案为我工作
- 使用不区分大小写的FS(MAC)和-f工作!谢谢。
- 不工作在Linux
- 这应该是Windows公认的答案。这是唯一一个为我工作!
- git mv File file为我工作。谢谢指挥!
- 所以,把这个文件夹在Windows中没有一个-f旗。
- 因此,要考虑git -c"core.ignorecase=false" add .文件已经提交了案例研究。
使用sourcetree,我可以从用户界面完成这一切
- 将FILE.ext重命名为whatever.ext。
- 阶段文件
- 现在将whatever.ext重命名为FILE.ext
- 重新准备那个文件
这有点乏味,但如果你只需要对几个文件进行处理,那就很快了。
- 同一个Git Bash
- "这是一个文件",没有其他的答案来为我工作。它甚至可以与老式的Windows命令提示符。
- 我没有意识到这在舞台区域起作用。但在我的例子中,我想修改文件夹名以及这些文件夹中的一些文件。所以我首先将所有文件夹重命名为临时名称。提交了新名称(其中的所有文件)和"已删除"文件。Git将它们全部标记为"重命名"。然后将所有这些文件夹重新命名为新的案例版本,并再次提交。最后,合并了这两个提交。但是根据您所写的,我可以直接通过sating区域完成整个工作,而不创建2 commits+merge。
- 还可以与Gitkraken一起使用文件夹名。
在OSX下,为了避免这个问题并避免在不区分大小写的文件系统上开发其他问题,可以使用磁盘实用程序创建区分大小写的虚拟驱动器/磁盘映像。
运行磁盘实用程序,创建新的磁盘映像,并使用以下设置(或根据需要进行更改,但要区分大小写):
一定要告诉Git它现在在区分大小写的fs上:
1
| git config core.ignorecase false |
- sort of the核选择,不是吗?
- 近一个案例是,核运行OSX驱动敏感的船上。你有没有写不活(嗯,Adobe)应用程序,或运行在自己那些愚蠢的VM的案例,但它是值得的,如果你的代码主要用于*nix系统。
- 这是唯一的选项,在工作。我想和你最终的休息在一个泡菜或另一种方式。解决问题的时间在做这个。
- 注意,有一个OS X的磁盘实用程序bug 10.11——它不会创建用例敏感的形象。你需要使用命令行工具hdiutil。apple.stackexchange.com /问题/ 217915 / & hellip;
- 这是一个高容量甚至已经在塞拉利昂。点击一个图标驱动A和添加一个没有限制的案例的敏感卷的大小。它只是一股空间与主卷和安装在/卷/卷的名称。
有时可以临时更改Git的大小写敏感度。两种可能的方法:
方法1(非常临时):
git -c core.ignorecase=true checkout mybranch关闭单个checkout命令的区分大小写。或者更一般地说:git -c core.ignorecase=<><>。(感谢VONC在评论中提出这一点。)
方法2(半永久性):
要将设置更改更长时间(例如,如果在将其更改回之前需要运行多个命令):
git config core.ignorecase(返回当前设置,如false)。
git config core.ignorecase<>设置所需的新设置。
…运行多个其他命令…
git config core.ignorecase<>—将配置值设置回原来的设置。
- 为什么不直接用git -c core.ignorecase= checkout <>呢?之后无需重置。
- 很好的一点-更新了答案以包括这一点。
- 我对提议的核心有一种奇怪的体验。当从小写变为大写时忽略使用,但不是从大写变为小写。似乎唯一可靠的解决方案是停止使用无法识别文件名大小写的操作系统。
- 有什么理由要临时改变吗?如果我将设置更改为区分大小写,这会导致任何问题吗?
- 这可能取决于几个因素,特别是目标文件系统是否区分大小写-请参见文件系统中的en.wikipedia.org/wiki/case-sensitivity。如果部署文件系统对用于开发的文件系统具有不同的区分大小写能力,则可能需要进行临时更改。在我的案例中,我在一个团队中工作,每个人都希望有相同的Git设置(即区分大小写),所以如果我关闭它,它需要是临时的。
1)将文件Name.jpg重命名为name1.jpg。
2)提交删除的文件Name.jpg。
3)将文件name1.jpg重命名为Name.jpg。
4)Ammond在以前的承诺中增加了文件Name.jpg。
1 2
| git add
git commit --amend |
- 我要在这fatal: bad source, source=name1.jpg, destination=name.jpg三步。你有建议吗?谢谢
- 你可以不做一做,只是git add。
- 在哈克,不是吗?patching或猴子。
我从其他答案中尝试了以下解决方案,但它们不起作用:
- git mv filename
- git rm -f filename
如果您的存储库像mine一样托管在github上,则可以在origin(github.com)上重命名该文件,并以自上而下的方式强制重命名该文件。
下面的说明取决于您试图重命名的文件类型,也就是说,它是Github认为在浏览器中可编辑(代码、文本等)还是不可编辑(图像、二进制等)的文件类型。
访问github.com
在github.com上导航到您的存储库并选择您正在使用的分支
使用网站的文件导航工具,导航到要重命名的文件
GitHub允许您在浏览器中编辑文件吗?
- 可编辑的
- 单击"编辑此文件"图标(看起来像铅笔)
- 更改文件名文本输入中的文件名
b)不可编辑
在新选项卡中打开"下载"按钮并将文件保存到计算机
重命名下载的文件
在github.com上的上一个选项卡中,单击"删除此文件"图标(看起来像垃圾桶)
确保选中"直接提交到branchname分支"单选按钮,然后单击"提交更改"按钮。
在github.com上的同一目录中,单击"上载文件"按钮。
从计算机上载重命名的文件
确保选中"直接提交到branchname分支"单选按钮,然后单击"提交更改"按钮。
在本地,签出/获取/拉动分支
多恩
- 我直接在BitBucket上重命名,它起作用了。谢谢。
- 很高兴知道。理论上,这项技术可以在任何存储库托管平台上工作,但我想知道它是否有任何不可用的平台。
- 不适用于不能在浏览器中编辑的文件,如图像或PDF;显然没有编辑选项。
- @Abhijitsarkar说得对。我更新了这些案例的答案。我测试并验证了这些指令的有效性。
MacOSXhighSierra10.13稍微修正了这个问题。只需为Git项目创建一个虚拟的APFS分区,默认情况下,它没有大小限制,也不占用任何空间。
在磁盘实用程序中,选择容器磁盘时单击+按钮。
在"格式"下选择APF(区分大小写)
命名为Sensitive。
利润
可选:在名为git和ln -s /Volumes/Sensitive/git /Users/johndoe/git的敏感文件夹中创建一个文件夹。
您的驱动器将在/Volumes/Sensitive/中
如何在Git中只提交区分大小写的文件名更改?
- 我喜欢这个建议,它优雅而无痛地解决了这个问题,而没有诉诸丑陋的解决方法。谢谢!
我使用以下步骤:
1 2 3 4
| git rm -r --cached .
git add --all .
git commit -a -m"Versioning untracked files"
git push origin master |
对我来说是一个简单的解决方案
我在MacOS上已经多次遇到这个问题。Git区分大小写,但Mac只保留大小写。
有人提交了一个文件:Foobar.java,几天后决定将其重命名为Foobar.java。当您提取最新的代码时,它会与The following untracked working tree files would be overwritten by checkout...一起失败。
唯一可靠的解决方法是:
git rm Foobar.java
承诺一条你不能错过git commit -m 'TEMP COMMIT!!'的信息
拉
这将弹出一个冲突,迫使您合并冲突-因为您的更改将其删除,但另一个更改将其重命名(因此出现问题)
接受您的更改,即"删除"
git rebase --continue
现在,放弃你的解决方法:git rebase -i HEAD~2和dropTEMP COMMIT!!。
确认该文件现在称为Foobar.java。
当您对文件进行了大量重命名,其中一些只是更改了大小写时,很难记住哪个是哪个。手动"git moving"这个文件可以做很多工作。因此,在文件名更改任务中我要做的是:
将所有非Git文件和文件夹删除到其他文件夹/存储库中。
提交当前空的git文件夹(这将显示为删除的所有文件)。
将所有文件添加回原始git文件夹/存储库。
提交当前非空Git文件夹。
这样可以解决所有的案例问题,而不必试图找出您重命名的文件或文件夹。
- 为什么第4段中的git commmit --amend?否则,删除所有文件时会有一个额外的提交。或者你也可以在壁球上使用git rebase -i。
如果不起作用,请使用git rm文件名从磁盘中删除文件并将其添加回去。