ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Git 中提交仅区分大小写的文件名更改?

我通过将第一个字母取消大写来更改了一些文件名,如 Name.jpgname.jpg。 Git 无法识别这些更改,我不得不删除这些文件并再次上传它们。 Git 在检查文件名更改时是否可以区分大小写?我没有对文件本身进行任何更改。

@nif 这不太正确,Git 实际上有一个配置设置来控制它是否忽略区分大小写。
请参阅 stackoverflow.com/a/24979063/6309:从 git 2.0.1 开始,一个简单的 git mv 就可以工作。
@nif 只是想添加(几年后;)HFS 可以区分大小写,但默认情况下不区分大小写。我有一个使用区分大小写的 HFS 格式化的单独 65 GiB 分区,我将其用于我的 git 工作副本。我必须承认,这让我失去了很多理智……

M
Mark Amery

只要您只是重命名一个文件,而不是一个文件夹,您就可以使用git mv

git mv -f yOuRfIlEnAmE yourfilename

(从 Git 2.0.1 中的 a change 开始,上述咒语中的 -f 标志是多余的,但在较旧的 Git 版本中需要它。)


这给了我“源目录为空”,而它不是
在这里使用 MacOS(不区分大小写的 FS)和 -f 工作!谢谢你的提示
不要忘记提供完整的文件路径。很明显,我知道,但让我有一段时间了
对于最高投票评论:您确实需要使用最新 git (2.18) 的 -f 开关,否则您可能会收到 fatal: destination exists 错误。
请务必注意,如果您尝试重命名目录而不是文件,这将不起作用。如果您需要重命名目录,则必须改为对目录中的每个文件执行 git mv
s
sleske

Git 有一个配置设置,告诉它是否需要区分大小写或不区分大小写的文件系统:core.ignorecase。要告诉 Git 区分大小写,只需将此设置设置为 false。 (如果您已经推送了文件,请小心,那么您应该首先在给出其他答案的情况下移动它们)。

git config core.ignorecase false

请注意,在不区分大小写的文件系统上将此选项设置为 false 通常是个坏主意。这样做会导致奇怪的错误。例如,以仅更改字母大小写的方式重命名文件将导致 git 报告虚假冲突或创建重复文件(来自 Mark Amery 的评论)。

文档

git config documentation

core.ignorecase 如果为 true,则此选项启用各种解决方法,以使 git 在不区分大小写的文件系统(如 FAT)上更好地工作。例如,如果一个目录列表在 git 需要 Makefile 时找到了 makefile,git 将假定它确实是同一个文件,并继续将其记住为 Makefile。默认值为 false,除了 git-clone(1) 或 git-init(1) 将在创建存储库时探测并将 core.ignorecase 设置为 true。

不区分大小写的文件系统

我所知道的两个最流行的具有不区分大小写文件系统的操作系统是

视窗

操作系统


附带说明一下,我不认为 Mac OS X 本身不区分大小写。相反,文件系统决定了区分大小写。格式化 HFS+ 分区时,用户可以选择区分大小写或不区分大小写。不区分大小写是默认设置。
在此答案中似乎非常值得注意的是,在不区分大小写的文件系统上将此选项设置为 false 是一个坏主意。这不一定很明显。例如,我刚刚在我的 Mac 上尝试过,认为它可以解决我的问题,然后将文件从 productPageCtrl.js 重命名为 ProductPageCtrl.jsgit status 看到了一个名为 ProductPageCtrl.js 文件,但 没有 认为 productPageCtrl.js 已被删除。当我添加新文件、提交并推送到 GitHub 时,GitHub 存储库现在包含 both 文件,即使我的(假设是最新的)本地存储库只有一个文件。
@MarkAmery 这听起来很像您的 Git 客户端中的错误。你报案了吗?
@Domi 这不是错误,这是预期的行为。实际上,在不敏感的文件系统上将其设置为 false 是一个坏主意,因为这就是发生的情况。 git 没有看到小写文件被删除的原因是文件系统没有将其报告为已删除,因为它确实忽略了大小写,而 git 没有将此选项设置为 false。这并不是说文件名在 ntfs 上没有小写和大写,或者只是文件名查找忽略了大小写。
@Domi git is 足够聪明。这就是为什么您应该在不区分大小写的文件系统上将此设置为 false。使用 git mv 移动文件并查看 git 如何管理它。如果您在没有 git 的情况下移动文件,则 什么 git 无能为力,因为文件系统不会向 git 说出真相。这是 ntfs/fat/hfs 之类的问题,而不是 git/linux。
F
FiniteLooper

使用 SourceTree,我可以从 UI 中完成这一切

将 FILE.ext 重命名为whatever.ext 暂存该文件 现在将whatever.ext 重命名为file.ext 再次暂存该文件

这有点乏味,但是如果您只需要对几个文件执行此操作,则非常快


与 git bash 相同
“暂存该文件”是重要部分 - 上面的其他答案都不适合我。它实际上适用于普通的旧 Windows 命令提示符。
我没有意识到这在暂存区有效。但就我而言,我想修改文件夹名称以及这些文件夹中的一些文件。所以我首先将所有文件夹重命名为临时名称。提交新名称(其中的所有文件)和“已删除”文件。 Git 将它们全部标记为“重命名”。然后将所有这些文件夹重命名为新的案例版本并再次提交。最后,合并这 2 个提交。但是根据您写的内容,我可以直接通过座位区完成整个工作,而无需创建 2 次提交 + 合并。
也适用于文件夹名称的 gitkraken。
这必须是这里建议的最简单和最容易理解的解决方案。对于 git-noobs(像我一样)“暂存”文件意味着“添加”文件而不提交文件。
S
Sijmen Mulder

这就是我在 OS X 上所做的:

git mv File file.tmp
git mv file.tmp file

两个步骤,否则我会收到“文件存在”错误。也许可以通过添加 --cached 等一步完成。


正如最佳答案所暗示的那样,-f(强制)是您正在寻找的标志
@rperryng - 不,如果底层 FS 不区分大小写,则 -f 标志无济于事。但是,两步解决方案对我有用
使用不区分大小写的 FS(在 Mac 上)并且 -f 有效!谢谢你的提示
这也适用于没有 -f 标志的 Windows 上的文件夹。
git -c "core.ignorecase=false" add . 将考虑其大小写已更改的文件以进行提交。
a
andrewvergel

我使用了以下步骤:

git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master

对我来说是一个简单的解决方案


这就是解决方案。与其他答案不同,它在您进行批量重命名时效果很好。在 glamourphilly.org 上,我们需要将每个 .Jpg 更改为 .jpg。在 Finder 中,您可以像这样进行批量重命名,这个答案可以让您签入。
这对我来说也是唯一简单的解决方案
这是迄今为止最简单的解决方案。适用于文件和目录。谢谢!
OMG THANK THANK YOUUUU 我已经准备好扯头发了,为什么我在 github 上有两个相同文件夹的案例,即使在本地我只有一个案例!这很令人沮丧,谢谢
这个命令实际上做的是删除 git 认为仍然存在的文件/文件夹名称的缓存版本。因此,它将清除其缓存,但将所有内容保留在当前文件夹中(您已在本地进行更改),但它会看到那些其他错误的案例文件夹/文件不再存在,因此将在 git status 中将它们显示为已删除。然后你可以推送到 github,它会删除错误案例的文件夹/文件。这个答案有一个描述命令含义的图形:stackoverflow.com/a/41863575/4484799
S
Steve Chambers

有时临时更改 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 config core.ignorecase <> - 将配置值设置回之前的设置。


为什么不直接git -c core.ignorecase=<true or false> checkout <<branch>>?之后没有什么可以重置的。
当从小写变为大写时,我对建议的 core.ignorecase 工作有一种奇怪的体验,但对于大写到小写却没有。似乎唯一可靠的解决方案是停止使用无法识别文件名大小写的操作系统。
为什么它应该是暂时的变化?如果我只是将设置更改为区分大小写,这会导致任何问题吗?
这可能取决于几个因素,特别是目标文件系统是否区分大小写 - 请参阅 en.wikipedia.org/wiki/Case_sensitivity#In_filesystems。如果部署文件系统与用于开发的文件系统区分大小写不同,则可能需要临时更改。 在我的情况下,我在一个团队中工作,每个人都应该有相同的 Git 设置(即区分大小写),所以如果我关闭它,它需要是临时的。
佚名

我们可以使用 git mv 命令。下面的示例,如果我们将文件 abcDEF.js 重命名为 abcdef.js,那么我们可以从终端运行以下命令

git mv -f .\abcDEF.js  .\abcdef.js

自 git v2.0.1 (@see github.com/git/git/commit/… ) 以来不再需要强制
u
user1821510

在 OSX 下,为了避免这个问题并避免在不区分大小写的文件系统上开发的其他问题,您可以使用磁盘工具来创建区分大小写的虚拟驱动器/磁盘映像。

运行磁盘实用程序,创建新磁盘映像,并使用以下设置(或根据需要更改,但请注意区分大小写):

https://i.stack.imgur.com/YNtpX.png

确保告诉 git 它现在在区分大小写的 FS 上:

git config core.ignorecase false

不,核在 OSX 上运行完全区分大小写的引导驱动器。您将不得不在没有编写不佳的(咳咳,Adobe)应用程序的情况下生活,或者在他们自己的案例愚蠢的 VM 中运行这些应用程序,但如果您主要为 *nix 系统编写代码,那么这是值得的。
这是唯一可以正常工作的选项。我已经尝试了其余的,但你最终会以一种或另一种方式泡菜。通过这样做正确解决问题。
请注意,磁盘工具有一个错误 OS X 10.11——它不会创建区分大小写的图像。您需要使用命令行工具 hdiutil。 apple.stackexchange.com/questions/217915/…
使用 High Sierra 中的 APFS,这更加容易。单击带有加号的驱动器图标,然后添加一个区分大小写且没有大小限制的卷。它只是与主卷共享空间并安装在 /Volumes/volume-name 上。
A
Anupam

与@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也不会识别大小写差异,您还必须在静态根目录中手动执行上述操作


M
Mark Amery

将文件 Name.jpg 重命名为 name1.jpg 提交删除的文件 Name.jpg 将文件 name1.jpg 重命名为 name.jpg 修改添加的文件 name.jpg 到之前的提交 git add name.jpg git commit --amend


我在第 3 步收到此 fatal: bad source, source=name1.jpg, destination=name.jpg。您有什么建议吗?谢谢
您不能进行提交,只需 git add
为我工作。老实说,从审计的角度来看,它实际上是正确的。
正如 CBarr's answer 所指出的,您不需要在此处进行中间提交。您可以只重命名、暂存、重命名、暂存,然后提交,而无需在此答案使用的中间额外提交。
u
user110857

我从其他答案中尝试了以下解决方案,但它们不起作用:

git mv 文件名

git rm -f 文件名

如果您的存储库是远程托管的(GitHub、GitLab、BitBucket),您可以重命名原始文件 (GitHub.com) 并强制以自上而下的方式重命名文件。

下面的说明与 GitHub 相关,但是它们背后的一般想法应该适用于任何远程存储库托管平台。请记住您尝试重命名的文件类型很重要,也就是说,它是 GitHub 认为在浏览器中可编辑(代码、文本等)还是不可编辑(图像、二进制文件等)的文件类型。

访问 GitHub.com 导航到您在 GitHub.com 上的存储库并选择您正在使用的分支 使用该站点的文件导航工具,导航到您打算重命名的文件 GitHub 是否允许您在浏览器中编辑文件? a.) 可编辑单击“编辑此文件”图标(它看起来像铅笔)在文件名文本输入中更改文件名 b.)不可编辑在新选项卡中打开“下载”按钮并将文件保存到您的计算机重命名下载的文件 在 GitHub.com 上的上一个选项卡中,单击“删除此文件”图标(它看起来像一个垃圾箱) 确保选中“直接提交到分支名称分支”单选按钮,然后单击“提交更改”按钮在 GitHub.com 上的同一目录,单击“上传文件”按钮 从您的计算机上传重命名的文件 确保选中“直接提交到分支名称分支”单选按钮并单击“提交更改”按钮本地,结帐/获取/拉取分支完成


我直接在 BitBucket 上重命名并且它起作用了。谢谢。
很高兴知道。这种技术理论上应该适用于任何存储库托管平台,但我很想知道是否有任何它不能使用。
不适用于无法在浏览器中编辑的文件,例如图像或 PDF;显然,没有编辑选项。
@AbhijitSarkar 好点。我更新了这些案例的答案。我测试并验证了这些说明是否有效。
A
AmerllicA

使用以下命令:

git config --global  core.ignorecase false

您可以将您的 git 系统全局配置为对文件和文件夹名称区分大小写。


R
Ray Foss

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
@AmerllicA 这不会更改您的系统硬盘驱动器,只会更改区分大小写的分区。在区分大小写的情况下,性能实际上会稍好一些。您链接到的解决方案并不适用于所有人,因为假定类似 linux 的大小写敏感性的代码可能无法运行,例如当两个文件名称相同但大小写不同时。
R
Ricardo Virtudazo Jr

当你做了很多文件重命名并且其中一些只是改变大小写时,很难记住哪个是哪个。手动“git移动”文件可能是相当多的工作。所以在我的文件名更改任务中我会做的是:

将所有非 git 文件和文件夹删除到不同的文件夹/存储库。提交当前空的 git 文件夹(这将显示为所有文件已删除。)将所有文件添加回原始 git 文件夹/存储库。提交当前的非空 git 文件夹。

这将解决所有案例问题,而无需尝试找出您重命名了哪些文件或文件夹。


为什么不是第 4 段中的 git commmit --amend?否则,将有一个额外的提交与删除所有文件。或者您可以将 git rebase -i 与壁球一起使用。
A
Ashwin Jayaprakash

我在 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


-1。我无法重现您在此处提到的错误,没有它,其余的答案就没有意义。此外,在没有正在进行变基的情况下执行 git rebase --continue 只会产生 "No rebase in progress?" 错误,并且在步骤 4.2 期间没有正在进行变基,因此在那里运行该命令没有意义任何一个。
T
Think Digital

因此对于这种区分大小写的部署问题,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,可能会有所帮助


这很好,但它似乎使文件成为新文件,丢失所有历史记录,而不是简单地用所有更改重命名现有文件。
u
user

我接受了 @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()

g
gopal Pandey

如果没有任何效果,请使用 git rm filename 从磁盘中删除文件并将其添加回来。


如果您再次遇到此问题,请尝试此答案stackoverflow.com/a/55541435/4484799
K
Kodie Grantham

我为我制作了一个 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

v
victorm1710

如果您要进行更复杂的更改,例如更改目录名称大小写,则可以从 Linux 机器进行更改,因为 Linux 本身(以及 Linux 上的 git)将具有相同名称但大小写不同的文件/目录视为完全不同的文件/目录。

因此,如果你在 Windows 上,你可以使用 WSL 安装 Ubuntu,在那里克隆你的 repo,使用 VSCode 打开克隆的 repo 目录(使用 WSL 远程扩展从 Windows 访问 WSL Ubuntu),然后你将能够通过VSCode 并使用 VSCode git 集成提交/推送它们。