我已经通过取消首字母大写更改了一些文件名,Name.jpg
如name.jpg
. Git 无法识别这些更改,我不得不删除这些文件并再次上传它们。Git 在检查文件名更改时是否可以区分大小写?我没有对文件本身进行任何更改。
17 回答
Git 有一个配置设置,告诉它是否需要区分大小写或不区分大小写的文件系统:core.ignorecase
. 要告诉 Git 区分大小写,只需将此设置设置为false
. (如果您已经推送了文件,请小心,那么您应该首先在给出其他答案的情况下移动它们)。
git config core.ignorecase false
请注意,在不区分大小写的文件系统上将此选项设置为 false 通常是个坏主意。这样做会导致奇怪的错误。例如,以仅更改字母大小写的方式重命名文件将导致 git 报告虚假冲突或创建重复文件(来自 Mark Amery 的评论)。
文档
从git config
文档中:
core.ignorecase
如果为 true,则此选项启用各种变通方法,以使 git 在不区分大小写的文件系统(如 FAT)上更好地工作。例如,如果一个目录列表
makefile
在 git 期望时找到Makefile
,git 将假定它确实是同一个文件,并继续将它记住为Makefile
.默认值为 false,除了git-clone(1)或git-init(1)将在创建存储库时探测并设置
core.ignorecase
true (如果合适)。
不区分大小写的文件系统
我所知道的两个最流行的具有不区分大小写文件系统的操作系统是
- 视窗
- 操作系统
使用 SourceTree,我可以从 UI 中完成这一切
- 重命名
FILE.ext
为whatever.ext
- 暂存该文件
- 现在重命名
whatever.ext
为file.ext
- 再次暂存该文件
这有点乏味,但是如果您只需要对几个文件执行此操作,则非常快
这就是我在 OS X 上所做的:
git mv File file.tmp
git mv file.tmp file
两个步骤,否则我会收到“文件存在”错误。--cached
也许可以通过添加等一步完成。
有时临时更改 Git 的区分大小写很有用。
方法 #1 - 更改单个命令的区分大小写:
git -c core.ignorecase=true checkout mybranch
关闭单个checkout
命令的大小写敏感性。或更一般地说:. (感谢 VonC 在评论中提出的建议。)git -c core.ignorecase=
<<true or false>>
<<command>>
方法 #2 - 更改多个命令的区分大小写:
要更改设置更长的时间(例如,如果需要在更改回之前运行多个命令):
git config core.ignorecase
(这将返回当前设置,例如false
)。git config core.ignorecase
<<true or false>>
- 设置所需的新设置。- ...运行多个其他命令...
git config core.ignorecase
<<false or true>>
- 将配置值设置回之前的设置。
我使用了以下步骤:
git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master
对我来说是一个简单的解决方案
我们可以使用 git mv 命令。下面的示例,如果我们将文件 abcDEF.js 重命名为 abcdef.js,那么我们可以从终端运行以下命令
git mv -f .\abcDEF.js .\abcdef.js
在 OSX 下,为了避免这个问题并避免在不区分大小写的文件系统上开发的其他问题,您可以使用磁盘工具来创建区分大小写的虚拟驱动器/磁盘映像。
运行磁盘实用程序,创建新磁盘映像,并使用以下设置(或根据需要更改,但请注意区分大小写):
确保告诉 git 它现在在区分大小写的 FS 上:
git config core.ignorecase false
将文件重命名
Name.jpg
为name1.jpg
提交删除的文件
Name.jpg
将文件重命名
name1.jpg
为name.jpg
将添加的文件修改
name.jpg
为先前的提交git add name.jpg git commit --amend
我从其他答案中尝试了以下解决方案,但它们没有用:
如果您的存储库是远程托管的(GitHub、GitLab、BitBucket),您可以重命名原始文件 (GitHub.com) 并强制以自上而下的方式重命名文件。
下面的说明与 GitHub 相关,但是它们背后的一般想法应该适用于任何远程存储库托管平台。请记住您尝试重命名的文件类型很重要,也就是说,它是 GitHub 认为在浏览器中可编辑(代码、文本等)还是不可编辑(图像、二进制文件等)的文件类型。
- 访问 GitHub.com
- 导航到您在 GitHub.com 上的存储库并选择您正在使用的分支
- 使用站点的文件导航工具,导航到您要重命名的文件
- GitHub 是否允许您在浏览器中编辑文件?
- a.) 可编辑
- 单击“编辑此文件”图标(看起来像铅笔)
- 更改文件名文本输入中的文件名
- b.) 不可编辑
- 在新选项卡中打开“下载”按钮并将文件保存到您的计算机
- 重命名下载的文件
- 在 GitHub.com 上的上一个选项卡中,单击“删除此文件”图标(它看起来像一个垃圾桶)
- 确保选中“直接提交到
branchname
分支”单选按钮,然后单击“提交更改”按钮 - 在 GitHub.com 上的同一目录中,单击“上传文件”按钮
- 从您的计算机上传重命名的文件
- a.) 可编辑
- 确保选中“直接提交到
branchname
分支”单选按钮,然后单击“提交更改”按钮 - 在本地,结帐/获取/拉取分支
- 完毕
Mac OSX High Sierra 10.13 稍微修复了这个问题。只需为您的 git 项目创建一个虚拟 APFS 分区,默认情况下它没有大小限制并且不占用空间。
- 在磁盘工具中,在选择容器磁盘时单击 + 按钮
- 在格式下选择 APFS(区分大小写)
- 给它命名
Sensitive
- 利润
- 可选:在 Sensitive 中创建一个名为
git
andln -s /Volumes/Sensitive/git /Users/johndoe/git
您的驱动器将在/Volumes/Sensitive/
使用以下命令:
git config --global core.ignorecase false
您可以全局配置您的 git 系统,使其对文件和文件夹名称区分大小写。
当你做了很多文件重命名并且其中一些只是改变大小写时,很难记住哪个是哪个。手动“git移动”文件可能是相当多的工作。所以在我的文件名更改任务中我会做的是:
- 将所有非 git 文件和文件夹删除到不同的文件夹/存储库。
- 提交当前空的 git 文件夹(这将显示为所有文件已删除。)
- 将所有文件添加回原始 git 文件夹/存储库。
- 提交当前的非空 git 文件夹。
这将解决所有案例问题,而无需尝试找出您重命名了哪些文件或文件夹。
我在 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
和drop
TEMP COMMIT!!
- 确认文件现在被调用
FooBar.java
我接受了@CBarr的回答并编写了一个 Python 3 脚本来使用文件列表来执行此操作:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import os
import shlex
import subprocess
def run_command(absolute_path, command_name):
print( "Running", command_name, absolute_path )
command = shlex.split( command_name )
command_line_interface = subprocess.Popen(
command, stdout=subprocess.PIPE, cwd=absolute_path )
output = command_line_interface.communicate()[0]
print( output )
if command_line_interface.returncode != 0:
raise RuntimeError( "A process exited with the error '%s'..." % (
command_line_interface.returncode ) )
def main():
FILENAMES_MAPPING = \
[
(r"F:\\SublimeText\\Data", r"README.MD", r"README.md"),
(r"F:\\SublimeText\\Data\\Packages\\Alignment", r"readme.md", r"README.md"),
(r"F:\\SublimeText\\Data\\Packages\\AmxxEditor", r"README.MD", r"README.md"),
]
for absolute_path, oldname, newname in FILENAMES_MAPPING:
run_command( absolute_path, "git mv '%s' '%s1'" % ( oldname, newname ) )
run_command( absolute_path, "git add '%s1'" % ( newname ) )
run_command( absolute_path,
"git commit -m 'Normalized the \'%s\' with case-sensitive name'" % (
newname ) )
run_command( absolute_path, "git mv '%s1' '%s'" % ( newname, newname ) )
run_command( absolute_path, "git add '%s'" % ( newname ) )
run_command( absolute_path, "git commit --amend --no-edit" )
if __name__ == "__main__":
main()
如果没有任何效果,请使用 git rm filename 从磁盘中删除文件并将其添加回来。