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

Gil*_*man 1157 git case-sensitive git-config git-commit

我已经改变了被命名一些文件去首字母大写,如Name.jpgname.jpg.Git无法识别此更改,我不得不删除文件并再次上传.在检查文件名的变化时,Git是否有区分大小写的方法?我没有对文件本身进行任何更改.

Kei*_*ley 1363

你可以使用git mv:

git mv -f OldFileNameCase newfilenamecase
Run Code Online (Sandbox Code Playgroud)

  • 在最新版本中,您不再需要`-f`标志. (38认同)
  • 这给了我'源目录是空的',而它不是 (10认同)
  • 不要忘记提供完整的文件路径.很明显,我知道,但是让我待了一会儿 (6认同)
  • 需要注意的是,如果您尝试重命名目录而不是文件,则此方法不起作用。如果您需要重命名目录,则必须为目录中的每个文件执行“git mv”。 (4认同)
  • 在这里使用MacOS(不区分大小写的FS)和-f工作!谢谢你的提示 (3认同)
  • @Damon就是这个,因为你首先"mv"了目录(没有git),现在你试图通过`git mv`让git知道它?请参阅:/sf/answers/1899764121/ (3认同)
  • 奇怪的是,为了让它在 Mac OS 上运行,我首先必须将给定的文件“TestCase.ts”重命名为“TestcaseSomething.ts”,提交它,然后在最终结果之前将其更正为所需的结果“Testcase.ts”提交和推送。 (3认同)
  • 致命:不会添加文件别名'File.svg'('file.svg'已经存在于索引中)[在webstorm中有这个,但在CLI中工作正常) (2认同)
  • 对于我想要重命名的目录("失败:无效的参数"),这对我来说不适用于完整的文件路径而没有.奇怪的. (2认同)
  • 你不能用 `git mv` 移动目录。如果您尝试修改目录名称的大小写,则需要执行目录中的每个文件。 (2认同)
  • 最有投票权的评论:您*确实需要带有最新git(2.18)的-f开关,否则可能会收到“致命:目标存在”错误。 (2认同)

小智 927

Git有一个配置设置,告诉它是区分大小写还是不敏感:core.ignorecase.要告诉Git区分大小写,只需将此设置设置为false:

git config core.ignorecase false
Run Code Online (Sandbox Code Playgroud)

文档

git config文档:

core.ignorecase

如果为true,则此选项启用各种变通方法,以使git能够更好地处理不区分大小写的文件系统,如FAT.例如,如果目录列表makefile在git期望的时候找到Makefile,git将假定它实际上是同一个文件,并继续记住它Makefile.

默认值为false,但git-clone(1)git-init(1)core.ignorecase在创建存储库时进行探测并设置为true.

不区分大小写的文件系统

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

  • 视窗
  • OS X.

  • 在这个答案中似乎非常值得注意的是,在不区分大小写的文件系统上将此选项设置为"false"是一个坏主意*.这不一定是显而易见的.例如,我只是在我的Mac上试过这个,认为它可以解决我的问题,然后将`productPageCtrl.js`中的文件重命名为`ProductPageCtrl.js`.`git status`看到了一个名为`ProductPageCtrl.js`的*new*文件,但*不认为`productPageCtrl.js`已被删除.当我添加新文件,提交并推送到GitHub时,GitHub repo现在包含*两个*文件,即使我的(据称是最新的)本地仓库只有一个. (201认同)
  • @Domi这不是一个bug,这是预期的行为.事实上,在不敏感的文件系统上将其设置为false是一个坏主意,因为这就是发生的事情.git没有看到小写文件被删除的原因是文件系统没有将其报告为已删除,因为它*忽略了*情况,而git没有将此选项设置为false.它不是文件名在ntfs或fat上没有较低的vs大写它只是文件名查找忽略了这种情况. (17认同)
  • @Domi git*足够聪明.这就是为什么你不应该*在不区分大小写的文件系统上将其设置为false.使用`git mv`移动文件,看看git如何管理它.如果你在没有git的情况下移动文件,那么*git可以做什么,因为文件系统没有告诉git的真相.这是ntfs/fat/hfs和类似的问题,而不是git/linux. (13认同)
  • 另外,我不认为Mac OS X本身不区分大小写.相反,它是确定区分大小写的文件系统.格式化HFS +分区时,用户可以选择是使其区分大小写还是不区分大小写.不区分大小写不区分大小写. (8认同)
  • @MarkAmery这听起来很像你的Git客户端中的一个bug.你提交了一份报告吗? (4认同)
  • 应编辑帖子以包含此处提到的各种警告。因为这个,我浪费了很多时间。 (3认同)
  • 原来这是在项目中默认启用的。确实让生活变得有趣了一点。 (2认同)
  • @ohcibi 如果它的行为方式如此,这对我来说似乎是一个错误。将标志“FILE_FLAG_POSIX_SEMANTICS”传递给方法以使用区分大小写的名称来验证文件是否存在是很容易的。如果设置了此标志,则不会找到该文件。同样对于查找文件,您可以将“FileFirstFileEx”与“FIND_FIRST_EX_CASE_SENSITIVE”一起使用。参考资料:https://mathematica.stackexchange.com/questions/97734/case-sensitive-file-names-windowsposix https://msdn.microsoft.com/en-us/library/windows/desktop/aa364419(v=vs .85).aspx (2认同)
  • 通过以下方式添加全局标志:`git config --global core.ignorecase false` (2认同)
  • 要重命名/重新命名目录,您应该`git mv subjectdirectory tmp`然后`git mv tmp subjectDirectory`。这将避免@Mark Amery 遇到的问题。 (2认同)

CBa*_*arr 132

使用SourceTree我可以从UI完成所有这些操作

  • 重命名FILE.extwhatever.ext
  • 舞台那个文件
  • 现在重命名whatever.extfile.ext
  • 再次播放该文件

这有点单调乏味,但如果你只需要对几个文件进行操作就很快了

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

Sij*_*der 117

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

git mv File file.tmp
git mv file.tmp file
Run Code Online (Sandbox Code Playgroud)

两个步骤因为否则我得到"文件存在"错误.也许它可以通过添加--cached等一步完成.

  • 正如最佳答案所示,`-f`(force)是你正在寻找的旗帜 (18认同)
  • @rperryng-不,如果基础FS不区分大小写,则`-f`标志无济于事。但是,两步解决方案对我有用 (4认同)
  • `git -c "core.ignorecase=false" add .` 将考虑大小写已更改的文件以进行提交。 (2认同)

Ste*_*ers 45

暂时改变Git的区分大小写有时会很有用.两种可能的方法: -

方法1:

git -c core.ignorecase=true checkout mybranch关闭单个checkout命令的区分大小写.或者更一般地说:.(感谢VonC在评论中提出这一建议.)git -c core.ignorecase= <<true or false>> <<command>>

方法2:

要更改设置更长时间(例如,如果需要在更改之前运行多个命令):

  1. git config core.ignorecase(这会返回当前设置,例如false).
  2. git config core.ignorecase <<true or false>> - 设置所需的新设置.
  3. ...运行多个其他命令......
  4. git config core.ignorecase <<false or true>> - 将配置值设置回其先前的设置.

  • 我对建议的 core.ignorecase 在从小写更改为大写时工作有一种奇怪的体验,但对于大写更改为小写则不然。似乎唯一可靠的解决方案是停止使用无法识别文件名大小写的操作系统。 (2认同)

小智 45

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

git mv -f .\abcDEF.js  .\abcdef.js
Run Code Online (Sandbox Code Playgroud)

  • 自 git v2.0.1 起不再需要强制(@see https://github.com/git/git/commit/baa37bff9a845471754d3f47957d58a6ccc30058 ) (3认同)

use*_*510 43

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

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

Mac磁盘实用程序截图

一定要告诉git它现在是一个区分大小写的FS:

git config core.ignorecase false
Run Code Online (Sandbox Code Playgroud)

  • 核选项的排序,不是吗? (72认同)
  • 不,核正在OSX上运行一个完全区分大小写的启动驱动器.你必须没有写得不好的(ahem,Adobe)应用程序,或者在他们自己的案例愚蠢的虚拟机中运行它们,但如果你主要为*nix系统编码,它是值得的. (15认同)
  • 使用APFS在High Sierra,这更容易.单击带有加号的驱动器图标,然后添加一个不区分大小的区分大小写的卷.它只与主卷共享空间并挂载在/ Volumes/volume-name. (6认同)
  • 请注意,磁盘工具有一个错误OS X 10.11 - 它不会创建区分大小写的图像.您需要使用命令行工具hdiutil.http://apple.stackexchange.com/questions/217915/how-to-create-a-case-sensitive-filesystem-in-10-11-1 (2认同)

Ame*_*icA 21

使用以下命令:

git config --global  core.ignorecase false
Run Code Online (Sandbox Code Playgroud)

您可以全局配置 git 系统,使其文件和文件夹名称区分大小写。


gme*_*ben 18

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

如果您的存储库像我的一样托管在GitHub上,您可以在源(GitHub.com)上重命名文件并以自上而下的方式强制重命名文件.

下面的说明取决于您尝试重命名的文件类型,即,它是否是GitHub认为可编辑的文件类型(代码,文本等)或浏览器中的不可编辑(图像,二进制等).

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


raz*_*zon 17

1)将文件重命名Name.jpgname1.jpg

2)提交删除的文件 Name.jpg

3)将文件重命名name1.jpgname.jpg

4)将添加的文件修改name.jpg为先前的提交

git add
git commit --amend
Run Code Online (Sandbox Code Playgroud)

  • 我在第3步中遇到“致命:错误的源,source = name1.jpg,destination = name.jpg”的问题。谢谢 (2认同)
  • 你不能提交,只需要`git add`。 (2认同)

Anu*_*pam 13

与@Sijmen的答案类似,这是我在重命名目录时在OSX上起作用的方式(灵感来自另一篇文章):

git mv CSS CSS2
git mv CSS2 css
Run Code Online (Sandbox Code Playgroud)

简单地做git mv CSS css就给出了无效的参数错误:fatal: renaming '/static/CSS' failed: Invalid argument可能是因为OSX的文件系统不区分大小写

ps BTW如果您使用的是Django,collectstatic也无法识别大小写差异,因此您还必须在静态根目录中手动执行上述操作


CBa*_*arr 11

多年后我需要回到这个问题并提供另一个可能的解决方案!我在一个只需要重命名单个文件的项目中遇到了这个问题。这就是我所做的,它对我有用。

git mv -f src/MyFile.js src/myfile.js
Run Code Online (Sandbox Code Playgroud)

我从这个帖子和这个答案中学到了这一点

  • 这应该是正确的答案 (2认同)

小智 8

我使用了以下步骤:

git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master
Run Code Online (Sandbox Code Playgroud)

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

  • 这个命令实际上做的是删除 git 认为仍然存在的文件/文件夹名称的缓存版本。因此,它将清除缓存,但将所有内容保留在当前文件夹中(您在本地进行更改的位置),但它会看到其他错误大小写的文件夹/文件不再存在,因此将在“git status”中将它们显示为已删除。然后你可以推送到github,它会删除有错误情况的文件夹/文件。这个答案有一个图形描述了该命令的含义:/sf/answers/2930450281/ (11认同)
  • 这就是解决方案。与其他答案不同,当您进行批量重命名时,它效果很好。在 glamourphilly.org 上,我们需要将每个 .Jpg 更改为 .jpg。在 Finder 中,您可以像这样进行批量重命名,这个答案可以让您签入。 (6认同)
  • 这对我来说也是唯一简单的解决方案 (2认同)
  • 有人给这个人加薪! (2认同)

Ray*_*oss 7

Mac OSX High Sierra 10.13对此进行了一些修复。只需为您的git项目创建一个虚拟APFS分区,默认情况下它没有大小限制并且不占用空间。

  1. 在“磁盘工具”中,选择“容器”磁盘后单击“ +”按钮
  2. 在格式下选择APFS(区分大小写)
  3. 命名 Sensitive
  4. 利润
  5. 可选:在“敏感”文件夹中创建一个名为gitln -s /Volumes/Sensitive/git /Users/johndoe/git

您的驱动器将进入 /Volumes/Sensitive/

在此处输入图片说明

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


小智 7

因此对于这种区分大小写的部署问题,GitHub 的处理方式有很多解决方案。

\n

就我而言,我已将文件名大小写约定从大写更改为小写。

\n

我确实相信 git 可以跟踪更改,但此命令\ngit config core.ignorecase false规定了 git 在幕后如何运行

\n

就我而言,我运行了命令,git 突然有很多文件需要跟踪,标记为未跟踪。

\n

然后我点击 git add 。,然后 git 提交并再次在 netlify 上运行我的构建。

\n

然后,现在显示的所有错误都可以被跟踪(例如\n)Module not found: Can\'t resolve \'./Components/ProductRightSide\' in \'/opt/build/repo/components/products并修复,以便 git 能够成功跟踪和实施更改。

\n

这是一个很好的解决方法,并且可以轻松避免挫败感,但相信我,这肯定会起作用。

\n

PS:修复问题后,您可能需要运行命令\ngit config core.ignorecase true来恢复 git 区分大小写的工作方式。

\n

另外,注意git config core.ignorecase false其他文件扩展名存在问题,因此您可能需要注意,如果您知道自己\xe2\x80\x99正在做什么并且确定的话,请执行此操作。

\n

这是 netlify 上的一个帖子,可能可以帮助您

\n