我已经改变了一些文件名去首字母大写,如Name.jpg
到name.jpg
。Git无法识别此更改,因此我不得不删除文件并再次上传。检查文件名的更改时,Git是否可以区分大小写?我尚未对文件本身进行任何更改。
git mv
。
我已经改变了一些文件名去首字母大写,如Name.jpg
到name.jpg
。Git无法识别此更改,因此我不得不删除文件并再次上传。检查文件名的更改时,Git是否可以区分大小写?我尚未对文件本身进行任何更改。
git mv
。
Answers:
您可以使用git mv:
git mv -f OldFileNameCase newfilenamecase
-f
标志。
-f
使用最新的git(2.18)进行切换,否则可能会fatal: destination exists
出错。
Git的配置设置告诉它是否区分大小写:core.ignorecase
。要告诉Git区分大小写,只需将此设置设置为false
:
git config core.ignorecase false
core.ignorecase
如果为true,则此选项启用各种变通办法,以使git在不区分大小写的文件系统(例如FAT)上更好地工作。例如,如果目录列表
makefile
在git期望的时间找到Makefile
,则git将假定它确实是同一文件,并继续将其记为Makefile
。默认值为false,除了git-clone(1)或git-init(1)将
core.ignorecase
在创建存储库时进行探测并设置为true(如果适用)。
我所知道的两种最不区分大小写的文件系统是:
false
不区分大小写的文件系统上将此选项设置为一个好主意。这不一定很明显。例如,我刚刚在Mac上尝试过此操作,认为它可以解决我的问题,然后将文件从重命名productPageCtrl.js
为ProductPageCtrl.js
。git status
看到一个名为的新文件,ProductPageCtrl.js
但不认为productPageCtrl.js
已被删除。当我添加新文件,提交并推送到GitHub时,即使我(据说是最新的)本地存储区只有一个,GitHub存储区现在也包含两个文件。
git mv
移动文件,看看Git是如何对其进行管理。如果在没有git的情况下移动文件,则git无法执行任何操作,因为文件系统没有向git讲真相。这是ntfs / fat / hfs之类的问题,而不是git / linux。
使用SourceTree,我能够从UI进行所有操作
FILE.ext
为whatever.ext
whatever.ext
为file.ext
这有点乏味,但是如果您只需要对几个文件进行处理,那将会非常快
这是我在OS X上所做的:
git mv File file.tmp
git mv file.tmp file
两步,因为否则我收到“文件存在”错误。也许可以通过添加--cached
等一步来完成。
-f
(力)是您要寻找的旗帜
-f
如果基础FS不区分大小写,则该标志无济于事。但是,两步解决方案对我
-f
!谢谢你的提示
-f
标志的Windows文件夹。
git -c "core.ignorecase=false" add .
将考虑大小写已更改以提交的文件。
暂时更改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 -c core.ignorecase=<true or false> checkout <<branch>>
呢?之后没有任何重置。
在OSX下,为避免此问题并避免在不区分大小写的文件系统上进行开发时遇到其他问题,可以使用“磁盘工具”来创建区分大小写的虚拟驱动器 /磁盘映像。
运行磁盘实用程序,创建新的磁盘映像,并使用以下设置(或根据需要进行更改,但区分大小写):
确保告诉git它现在位于区分大小写的FS上:
git config core.ignorecase false
我从其他答案中尝试了以下解决方案,但它们不起作用:
如果您的存储库是远程托管的(GitHub,GitLab,BitBucket),则可以在源位置重命名文件(GitHub.com),并以自上而下的方式强制重命名该文件。
以下说明与GitHub有关,但是它们背后的一般思想应适用于任何远程存储库托管平台。请记住,您尝试重命名的文件类型很重要,也就是说,它是GitHub在浏览器中认为是可编辑的(代码,文本等)还是不可编辑的(图像,二进制等)文件类型。
branchname
选中“直接提交到分支”单选按钮,然后单击“提交更改”按钮branchname
选中“直接提交到分支”单选按钮,然后单击“提交更改”按钮1)重命名文件Name.jpg
为name1.jpg
2)提交删除的文件 Name.jpg
3)将文件重命名name1.jpg
为name.jpg
4)将添加的文件修改name.jpg
为先前的提交
git add
git commit --amend
fatal: bad source, source=name1.jpg, destination=name.jpg
在第3步得到这个。您有建议吗?Thx
git add
。
我使用了以下步骤:
git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master
对我来说是一个简单的解决方案
Mac OSX High Sierra 10.13对此进行了一些修复。只需为您的git项目创建一个虚拟APFS分区,默认情况下它没有大小限制并且不占用空间。
Sensitive
git
和ln -s /Volumes/Sensitive/git /Users/johndoe/git
您的驱动器将进入 /Volumes/Sensitive/
我在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
当您完成了许多文件重命名,而其中的一些只是大小写的更改时,很难记住是哪个。手动“ git move”文件可以完成很多工作。因此,在文件名更改任务期间我将要做的是:
这将解决所有案例问题,而无需尝试找出重命名的文件或文件夹。
git commmit --amend
第4段中?否则,将删除所有文件,从而产生额外的提交。或者您可以git rebase -i
与壁球一起使用。
我用@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()