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

时间:2013-07-16 17:41:46

标签: git case-sensitive git-commit git-config

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

16 个答案:

答案 0 :(得分:1244)

您可以使用git mv

git mv -f OldFileNameCase newfilenamecase

答案 1 :(得分:835)

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

git config core.ignorecase false

文档

来自git config documentation

  

core.ignorecase

     

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

     

默认值为false,除了git-clone(1)git-init(1)将在创建存储库时探测并设置core.ignorecase为真。

不区分大小写的文件系统

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

  • OS X

答案 2 :(得分:108)

使用SourceTree我可以从UI

完成所有这些操作
  1. 重命名 FILE.extwhatever.ext
  2. 舞台该文件
  3. 现在重命名 whatever.extfile.ext
  4. 再次该文件
  5. 这有点单调乏味,但如果您只需要对几个文件进行操作就很快

答案 3 :(得分:104)

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

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

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

答案 4 :(得分:41)

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

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

Mac Disk Utility Screenshot

确保告诉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 (半永久性)

要更长久地更改设置(例如,如果需要先执行多个命令再将其更改回),则:

  1. git config core.ignorecase(这将返回当前设置,例如false)。
  2. git config core.ignorecase <<true or false>> -设置所需的新设置。
  3. ...运行其他多个命令...
  4. 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认为可编辑的文件类型(代码,文本等)还是浏览器中不可编辑的(图像,二进制等)。

  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. 完成

答案 9 :(得分:5)

Mac OSX High Sierra 10.13在某种程度上解决了这个问题。只需为您的git项目创建一个虚拟APFS分区,默认情况下它没有大小限制,不占用空间。

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

    您的驱动器将在/Volumes/Sensitive/

    enter image description here

    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...

失败

我发现修复此问题的唯一可靠方法是:

  1. git rm Foobar.java
  2. 提交一条您不能错过git commit -m 'TEMP COMMIT!!'
  3. 的消息
  4. 这会弹出一个冲突,迫使你合并冲突 - 因为你的更改删除了它,但另一个更改被重命名(因此问题)它
    1. 接受您的更改,即删除&#39;
    2. git rebase --continue
  5. 现在放弃您的解决方法git rebase -i HEAD~2drop TEMP COMMIT!!
  6. 确认该文件现在称为FooBar.java

答案 12 :(得分:2)

当你完成了大量的文件重命名,而其中一些只是更改了大小写时,很难记住哪个是哪个。手动&#34; git moving&#34;该文件可以是一些工作。所以我在文件名更改任务期间要做的是:

  1. 将所有非git文件和文件夹删除到其他文件夹/存储库。
  2. 提交当前空的git文件夹(这将显示所有文件已删除。)
  3. 将所有文件添加回原始git文件夹/存储库。
  4. 提交当前非空的git文件夹。
  5. 这将解决所有案例问题,而不会试图找出您重命名的文件或文件夹。

答案 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()