我通过将第一个字母去大写来更改了一些文件名,如Name.jpg到name.jpg。Git无法识别此更改,我不得不删除文件并再次上传。有没有办法让Git在检查文件名更改时区分大小写?我没有对文件本身进行任何更改。
Name.jpg
name.jpg
Git有一个配置设置,告诉它是否需要区分大小写或不区分文件系统:core.ignorecase。要告诉Git区分大小写,只需将此设置设置为false。(如果您已经推送了文件,请小心,然后您应该首先移动它们给出其他答案)。
core.ignorecase
false
git config core.ignorecase false
请注意,在不区分大小写的文件系统上将此选项设置为false通常是一个坏主意。这样做会导致奇怪的错误。例如,以仅更改字母大小写的方式重命名文件将导致git报告虚假冲突或创建重复文件(马克·阿梅里的评论)。
从#0留档:
core.ignorecase如果为true,则此选项启用各种变通方法,使git能够在不区分大小写的文件系统上更好地工作,例如FAT。例如,如果目录列表在git期望Makefile时找到makefile,git将假定它实际上是同一个文件,并继续将其记住为Makefile。默认值为false,除了克隆体(1)或git-init(1)将在创建存储库时探测并设置core.ignorecase true(如果合适)。
如果为true,则此选项启用各种变通方法,使git能够在不区分大小写的文件系统上更好地工作,例如FAT。例如,如果目录列表在git期望Makefile时找到makefile,git将假定它实际上是同一个文件,并继续将其记住为Makefile。
Makefile
makefile
默认值为false,除了克隆体(1)或git-init(1)将在创建存储库时探测并设置core.ignorecase true(如果合适)。
我所知道的两种最流行的不区分大小写的文件系统是
这就是我在OS X上所做的:
git mv File file.tmpgit mv file.tmp file
两步,因为否则我得到了一个“文件存在”错误。也许可以通过添加--cached或其他方式在一步中完成。
--cached
只要你只是重命名文件,而不是文件夹,你就可以使用git mv:
git mv -f yOuRfIlEnAmE yourfilename
(从Git 2.0.1中的一个变化开始,上面咒语中的-f标志是多余的,但在旧的Git版本中需要它。)
-f
在OSX下,为了避免此问题并避免在不区分大小写的文件系统上进行开发时出现其他问题,您可以使用Disk实用程序创建一个对case敏感的虚拟驱动器/磁盘映像。
运行磁盘实用程序,创建新的磁盘映像,并使用以下设置(或根据需要更改,但保持区分大小写):
确保告诉git它现在在区分大小写的FS上:
我在MacOS上多次遇到这个问题。Git区分大小写,但Mac只保留大小写。
有人提交了一个文件:Foobar.java,几天后决定将其重命名为FooBar.java。当你拉取最新的代码时,它会以The following untracked working tree files would be overwritten by checkout...失败
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!!
将文件Name.jpg重命名为name1.jpg
name1.jpg
提交删除的文件Name.jpg
将文件name1.jpg重命名为name.jpg
将添加的文件name.jpg修改为以前的提交
git add name.jpggit commit --amend
使用SourceTree,我能够从UI完成这一切
FILE.ext
whatever.ext
file.ext
这有点乏味,但如果您只需要对几个文件进行操作,它会很快
当你做了很多文件重命名,其中一些只是大小写的改变时,很难记住哪个是哪个。手动“git移动”文件可能是相当多的工作。所以在我的文件名更改任务期间我会做的是:
这将解决所有案例问题,而无需尝试找出您重命名的文件或文件夹。
我从其他答案中尝试了以下解决方案,但它们不起作用:
git mv filename
git rm -f filename
如果您的存储库是远程托管的(GitHub、GitLab、BitBucket),您可以在源(GitHub.com)上重命名文件,并以自上而下的方式强制重命名文件。
下面的说明属于GitHub,但是它们背后的一般思想应该适用于任何远程存储库托管平台。记住你试图重命名的文件类型很重要,也就是说,它是GitHub认为浏览器内可编辑的文件类型(代码、文本等)还是不可编辑的(图像、二进制等)。
branchname
Mac OSX High Sierra 10.13在一定程度上修复了这个问题。只需为您的git项目创建一个虚拟APFS分区,默认情况下它没有大小限制,也不占用空间。
Sensitive
git
ln -s /Volumes/Sensitive/git /Users/johndoe/git
你的驱动器将在/Volumes/Sensitive/
/Volumes/Sensitive/
如何在Git中提交区分大小写的文件名更改?
有时暂时更改Git的大小写敏感性很有用。
方法#1-更改单个命令的大小写敏感性:
git -c core.ignorecase=true checkout mybranch关闭单个checkout命令的大小写敏感性。或者更一般地说:#3#4。(感谢VonC在评论中提出这一点。
git -c core.ignorecase=true checkout mybranch
checkout
方法#2-更改多个命令的大小写敏感性:
要将设置更改更长时间(例如,如果在更改之前需要运行多个命令):
git config core.ignorecase
我使用了以下步骤:
git rm -r --cached .git add --all .git commit -a -m "Versioning untracked files"git push origin master
对我来说是一个简单的解决方案
如果不起作用,请使用git rm文件名从磁盘中删除文件并将其添加回来。
类似于@Sijmen的回答,这是我在OSX上工作的时候重命名目录(灵感来自另一个帖子的这个答案):
git mv CSS CSS2git mv CSS2 css
简单地做git mv CSS css给出了无效的参数错误:fatal: renaming '/static/CSS' failed: Invalid argument可能是因为OSX的文件系统是不区分大小写
git mv CSS css
fatal: renaming '/static/CSS' failed: Invalid argument
p. s顺便说一句,如果您使用的是Django,Collect静态也无法识别大小写差异,您还必须在静态根目录中手动执行上述操作
我选择了@陈志立的答案并编写了一个Python 3脚本来使用文件列表来完成它:
#!/usr/bin/env python3# -*- coding: UTF-8 -*- import osimport shleximport 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 mv命令。下面的示例,如果我们将文件abcDEF.js重命名为abcdef.js那么我们可以从终端运行以下命令
git mv -f .\abcDEF.js .\abcdef.js
使用以下命令:
git config --global core.ignorecase false
您可以全局配置您的git系统对文件和文件夹名称区分大小写。
因此,对于GitHub如何处理这个区分大小写的部署问题,有很多解决方案。
在我的例子中,我将文件名大小写约定从大写更改为小写。
我相信git可以跟踪更改,但此命令git config core.ignorecase false决定了git在幕后的操作方式
在我的例子中,我运行命令,git突然有很多标记为未跟踪的文件要跟踪。
然后我点击git add.,然后git提交并再次在netlify上运行我的构建。
然后现在显示的所有错误都可以被跟踪,例如Module not found: Can't resolve './Components/ProductRightSide' in '/opt/build/repo/components/products并修复,以便git能够成功跟踪和实现更改。
Module not found: Can't resolve './Components/ProductRightSide' in '/opt/build/repo/components/products
这是一个很好的解决方法,远离挫折,但相信我,这肯定会奏效。
PS:修复问题后,您可能需要运行命令git config core.ignorecase true恢复git如何区分大小写。
git config core.ignorecase true
此外,注意git config core.ignorecase false与其他文件扩展名存在问题,因此您可能需要注意,如果您知道自己在做什么并且确信这一点,请这样做。
这是netlify上的线程,可能会有所帮助
我为自己制作了一个小写存储库文件名的bash脚本:
function git-lowercase-file {tmp="tmp-$RANDOM-$1"new=$(echo "$1" | tr '[:upper:]' '[:lower:]')git mv -f $1 $tmpgit mv -f $tmp $new}
然后你可以像这样使用它:
git-lowercase-file Name.jpg
如果您正在进行更复杂的更改,例如目录名称大小写更改,您可以从Linux机器进行更改,因为Linux本身(以及Linux上的git)将具有相同名称但不同大小写的文件/目录视为完全不同的文件/目录。
因此,如果您在Windows上,您可以使用WSL安装Ubuntu,在那里克隆您的存储库,使用VSCode打开克隆的存储库目录(使用WSL远程扩展从Windows访问WSL Ubuntu),然后您将能够通过VSCode进行重命名并使用VSCode git集成提交/推送它们。