我通过将第一个字母取消大写来更改了一些文件名,如 Name.jpg
到 name.jpg
。 Git 无法识别这些更改,我不得不删除这些文件并再次上传它们。 Git 在检查文件名更改时是否可以区分大小写?我没有对文件本身进行任何更改。
git mv
就可以工作。
git
工作副本。我必须承认,这让我失去了很多理智……
Git 有一个配置设置,告诉它是否需要区分大小写或不区分大小写的文件系统:core.ignorecase
。要告诉 Git 区分大小写,只需将此设置设置为 false
。 (如果您已经推送了文件,请小心,那么您应该首先在给出其他答案的情况下移动它们)。
git config core.ignorecase false
请注意,在不区分大小写的文件系统上将此选项设置为 false 通常是个坏主意。这样做会导致奇怪的错误。例如,以仅更改字母大小写的方式重命名文件将导致 git 报告虚假冲突或创建重复文件(来自 Mark Amery 的评论)。
文档
core.ignorecase 如果为 true,则此选项启用各种解决方法,以使 git 在不区分大小写的文件系统(如 FAT)上更好地工作。例如,如果一个目录列表在 git 需要 Makefile 时找到了 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 存储库现在包含 both 文件,即使我的(假设是最新的)本地存储库只有一个文件。
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
标志无济于事。但是,两步解决方案对我有用
-f
有效!谢谢你的提示
-f
标志的 Windows 上的文件夹。
git -c "core.ignorecase=false" add .
将考虑其大小写已更改的文件以进行提交。
我使用了以下步骤:
git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master
对我来说是一个简单的解决方案
git status
中将它们显示为已删除。然后你可以推送到 github,它会删除错误案例的文件夹/文件。这个答案有一个描述命令含义的图形:stackoverflow.com/a/41863575/4484799
有时临时更改 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 <
git -c core.ignorecase=<true or false> checkout <<branch>>
?之后没有什么可以重置的。
我们可以使用 git mv 命令。下面的示例,如果我们将文件 abcDEF.js 重命名为 abcdef.js,那么我们可以从终端运行以下命令
git mv -f .\abcDEF.js .\abcdef.js
在 OSX 下,为了避免这个问题并避免在不区分大小写的文件系统上开发的其他问题,您可以使用磁盘工具来创建区分大小写的虚拟驱动器/磁盘映像。
运行磁盘实用程序,创建新磁盘映像,并使用以下设置(或根据需要更改,但请注意区分大小写):
https://i.stack.imgur.com/YNtpX.png
确保告诉 git 它现在在区分大小写的 FS 上:
git config core.ignorecase false
与@Sijmen 的回答类似,这对我在 OSX 上 重命名目录 有用(灵感来自另一篇帖子的 this 回答):
git mv CSS CSS2
git mv CSS2 css
简单地做 git mv CSS css
给出了无效参数错误:fatal: renaming '/static/CSS' failed: Invalid argument
可能是因为 OSX 的文件系统是 case insensitive
ps顺便说一句,如果您使用的是Django,collectstatic也不会识别大小写差异,您还必须在静态根目录中手动执行上述操作
将文件 Name.jpg 重命名为 name1.jpg 提交删除的文件 Name.jpg 将文件 name1.jpg 重命名为 name.jpg 修改添加的文件 name.jpg 到之前的提交 git add name.jpg git commit --amend
fatal: bad source, source=name1.jpg, destination=name.jpg
。您有什么建议吗?谢谢
git add
。
我从其他答案中尝试了以下解决方案,但它们不起作用:
git mv 文件名
git rm -f 文件名
如果您的存储库是远程托管的(GitHub、GitLab、BitBucket),您可以重命名原始文件 (GitHub.com) 并强制以自上而下的方式重命名文件。
下面的说明与 GitHub 相关,但是它们背后的一般想法应该适用于任何远程存储库托管平台。请记住您尝试重命名的文件类型很重要,也就是说,它是 GitHub 认为在浏览器中可编辑(代码、文本等)还是不可编辑(图像、二进制文件等)的文件类型。
访问 GitHub.com 导航到您在 GitHub.com 上的存储库并选择您正在使用的分支 使用该站点的文件导航工具,导航到您打算重命名的文件 GitHub 是否允许您在浏览器中编辑文件? a.) 可编辑单击“编辑此文件”图标(它看起来像铅笔)在文件名文本输入中更改文件名 b.)不可编辑在新选项卡中打开“下载”按钮并将文件保存到您的计算机重命名下载的文件 在 GitHub.com 上的上一个选项卡中,单击“删除此文件”图标(它看起来像一个垃圾箱) 确保选中“直接提交到分支名称分支”单选按钮,然后单击“提交更改”按钮在 GitHub.com 上的同一目录,单击“上传文件”按钮 从您的计算机上传重命名的文件 确保选中“直接提交到分支名称分支”单选按钮并单击“提交更改”按钮本地,结帐/获取/拉取分支完成
使用以下命令:
git config --global core.ignorecase false
您可以将您的 git 系统全局配置为对文件和文件夹名称区分大小写。
Mac OSX High Sierra 10.13 稍微修复了这个问题。只需为您的 git 项目创建一个虚拟 APFS 分区,默认情况下它没有大小限制并且不占用空间。
在 Disk Utility 中,单击 + 按钮,同时选择 Container disk /git
您的驱动器将位于 /Volumes/Sensitive/
https://i.stack.imgur.com/6M3Vp.png
How do I commit case-sensitive only filename changes in Git?
APFS (Case-sensitive)
会使您的系统非常慢,您将面临许多奇怪的问题,我遇到了 ReactNative 构建问题,找不到一些地址。所以最好有 APFS
公司的默认值。对于 git 情况,最好使用 this solution。
当你做了很多文件重命名并且其中一些只是改变大小写时,很难记住哪个是哪个。手动“git移动”文件可能是相当多的工作。所以在我的文件名更改任务中我会做的是:
将所有非 git 文件和文件夹删除到不同的文件夹/存储库。提交当前空的 git 文件夹(这将显示为所有文件已删除。)将所有文件添加回原始 git 文件夹/存储库。提交当前的非空 git 文件夹。
这将解决所有案例问题,而无需尝试找出您重命名了哪些文件或文件夹。
git commmit --amend
?否则,将有一个额外的提交与删除所有文件。或者您可以将 git rebase -i
与壁球一起使用。
我在 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!!' Pull 这将弹出一个冲突,迫使您合并冲突 - 因为您的更改删除了它,但另一个更改重命名(因此问题)它接受您的更改,即“删除” git rebase --continue 现在放弃您的解决方法 git rebase -i HEAD~2 并删除 TEMP COMMIT!!确认该文件现在名为 FooBar.java
git rebase --continue
只会产生 "No rebase in progress?" 错误,并且在步骤 4.2 期间没有正在进行变基,因此在那里运行该命令没有意义任何一个。
因此对于这种区分大小写的部署问题,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 能够成功跟踪和实施更改。
这是一种非常有效的解决方法,并且可以避免沮丧,但相信我,这肯定会奏效。
PS:解决您的问题后,您可能需要运行命令 git config core.ignorecase true
来恢复 git 区分大小写的工作方式。
此外,请注意 git config core.ignorecase false
与其他文件扩展名存在问题,因此您可能需要注意,如果您知道自己在做什么并确定它,请执行此操作。
这是 netlify 上的thread,可能会有所帮助
我接受了 @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()
我为我制作了一个 bash 脚本来小写存储库文件名:
function git-lowercase-file {
tmp="tmp-$RANDOM-$1"
new=$(echo "$1" | tr '[:upper:]' '[:lower:]')
git mv -f $1 $tmp
git mv -f $tmp $new
}
那么你可以像这样使用它:
git-lowercase-file Name.jpg
如果您要进行更复杂的更改,例如更改目录名称大小写,则可以从 Linux 机器进行更改,因为 Linux 本身(以及 Linux 上的 git)将具有相同名称但大小写不同的文件/目录视为完全不同的文件/目录。
因此,如果你在 Windows 上,你可以使用 WSL 安装 Ubuntu,在那里克隆你的 repo,使用 VSCode 打开克隆的 repo 目录(使用 WSL 远程扩展从 Windows 访问 WSL Ubuntu),然后你将能够通过VSCode 并使用 VSCode git 集成提交/推送它们。
不定期副业成功案例分享
-f
开关,否则您可能会收到fatal: destination exists
错误。git mv
。