我通过对第一个字母进行去大写来更改了一些文件名,如Name.jpg
到name.jpg
。 Git无法识别此更改,我不得不删除文件并再次上传。在检查文件名的变化时,Git是否有区分大小写的方法?我没有对文件本身进行任何更改。
答案 0 :(得分:1244)
您可以使用git mv:
git mv -f OldFileNameCase newfilenamecase
答案 1 :(得分:835)
Git有一个配置设置,告诉它是区分大小写还是不区分大小写:core.ignorecase
。要告诉Git区分大小写,只需将此设置设置为false
:
git config core.ignorecase false
core.ignorecase
如果为true,则此选项启用各种变通方法,以使git能够更好地处理不区分大小写的文件系统,如FAT。例如,如果目录列表在git期望
makefile
时找到Makefile
,则git将假定它实际上是同一个文件,并继续将其记住为Makefile
。默认值为false,除了git-clone(1)或git-init(1)将在创建存储库时探测并设置
core.ignorecase
为真。
我知道的两个最常用的具有不区分大小写的文件系统的操作系统是
答案 2 :(得分:108)
使用SourceTree我可以从UI
完成所有这些操作FILE.ext
至whatever.ext
whatever.ext
到file.ext
这有点单调乏味,但如果您只需要对几个文件进行操作就很快
答案 3 :(得分:104)
这就是我在OS X上所做的:
git mv File file.tmp
git mv file.tmp file
两步,因为否则我收到“文件存在”错误。也许可以通过添加--cached
等来一步完成。
答案 4 :(得分:41)
在OSX下,为了避免此问题并避免在不区分大小写的文件系统上进行开发的其他问题,您可以使用“磁盘工具”来创建案例敏感虚拟驱动器 /磁盘映像。
运行磁盘工具,创建新磁盘映像,并使用以下设置(或根据需要更改,但保持区分大小写):
确保告诉git它现在是一个区分大小写的FS:
git config core.ignorecase false
答案 5 :(得分:34)
我们可以使用git mv命令。下面的示例,如果我们将文件abcDEF.js重命名为abcdef.js,则可以从终端运行以下命令
git mv -f .\abcDEF.js .\abcdef.js
答案 6 :(得分:27)
有时临时更改Git的大小写敏感度很有用。两种可能的方法:-
方法1 (非常临时):
git -c core.ignorecase=true checkout mybranch
以关闭单个checkout
命令的区分大小写。或更笼统地说:git -c core.ignorecase=
<<true or false>>
<<command>>
。 (在评论中建议VonC的原因。)
方法2 (半永久性):
要更长久地更改设置(例如,如果需要先执行多个命令再将其更改回),则:
git config core.ignorecase
(这将返回当前设置,例如false
)。git config core.ignorecase
<<true or false>>
-设置所需的新设置。git config core.ignorecase
<<false or true>>
-将配置值恢复为之前的设置。答案 7 :(得分:15)
1)将文件Name.jpg
重命名为name1.jpg
2)提交已删除的文件Name.jpg
3)将文件name1.jpg
重命名为name.jpg
4)将文件name.jpg
添加到先前的提交
git add
git commit --amend
答案 8 :(得分:12)
我从其他答案中尝试了以下解决方案,但它们不起作用:
如果您的存储库是远程托管的(GitHub,GitLab,BitBucket),您可以在源(GitHub.com)上重命名文件并以自上而下的方式强制重命名文件。
以下说明适用于GitHub,但其背后的一般概念应适用于任何远程存储库托管平台。请记住您尝试重命名的文件类型,即,它是GitHub认为可编辑的文件类型(代码,文本等)还是浏览器中不可编辑的(图像,二进制等)。
branchname
分支”单选按钮并单击“提交更改”按钮branchname
分支”单选按钮并单击“提交更改”按钮答案 9 :(得分:5)
Mac OSX High Sierra 10.13在某种程度上解决了这个问题。只需为您的git项目创建一个虚拟APFS分区,默认情况下它没有大小限制,不占用空间。
Sensitive
git
和ln -s /Volumes/Sensitive/git /Users/johndoe/git
您的驱动器将在/Volumes/Sensitive/
How do I commit case-sensitive only filename changes in Git?
答案 10 :(得分:4)
我使用了以下步骤:
git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master
对我来说是一个简单的解决方案
答案 11 :(得分:3)
我在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
答案 12 :(得分:2)
当你完成了大量的文件重命名,而其中一些只是更改了大小写时,很难记住哪个是哪个。手动&#34; git moving&#34;该文件可以是一些工作。所以我在文件名更改任务期间要做的是:
这将解决所有案例问题,而不会试图找出您重命名的文件或文件夹。
答案 13 :(得分:2)
类似于@Sijmen的答案,这对我来说重命名目录时在OSX上起作用(受到另一篇文章的this答案的启发):
[NotebookPasswordApp] CRITICAL | Bad config encountered during initialization:
[NotebookPasswordApp] CRITICAL | Unrecognized flag: '--allow-root'
仅执行git mv CSS CSS2
git mv CSS2 css
会导致无效的参数错误:git mv CSS css
可能是因为OSX的文件系统为case insensitive
p.s BTW,如果您使用的是Django,collectstatic也无法识别大小写差异,因此您还必须在静态根目录中手动执行上述操作
答案 14 :(得分:0)
如果没有任何效果,请使用git rm filename从磁盘删除文件,然后将其重新添加。
答案 15 :(得分:0)
我回答了@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()