git status显示由于大小写重命名后修改的两个文件

时间:2014-11-24 19:25:08

标签: git case-sensitive case-insensitive

使用git,在我的Mac上根据区分大小写的文件名重命名文件时,我显然没有使用正确的方法。

这是我目前情况的模拟,我不确定如何离开......

创建仓库并添加样本文件:

git init
touch Foo.js
git add .
git commit -m 'adding Foo.js'

我如何重命名'文件(但应该使用git mv...代替:()

mv Foo.js foo.js
git status

Git状态未显示任何更改,因此我更新了core.ignorecase属性

git config core.ignorecase false
git status

现在它显示我需要添加foo.js。

git add foo.js
git status
git commit -m 'renaming Foo.js to foo.js'

现在,如果我尝试修改foo.js

vim foo.js <-- edit foo.js
git status

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   Foo.js
    modified:   foo.js

如果我尝试git rm Foo.js,它也会尝试删除我的foo.js文件。

我当前的git --version2.1.2

关于我如何修复问题的任何想法Foo.js都消失了,我只有foo.js

2 个答案:

答案 0 :(得分:2)

使用&#39; git revert&#39;在该提交中,您包含了文件的重命名版本。 然后,您可以[正确]重命名文件 - 正如您在描述中所指出的那样 - 并创建一个新提交。

正确重命名文件的示例:

git mv --force Foo.js foo.js

答案 1 :(得分:0)

Git 2.29(2020年第四季度)添加了另一种处理这种情况的方法:

请参见commit 087c616commit 409f066commit 5065ce4brian m. carlson (bk2204)(2020年9月20日)。
(由Junio C Hamano -- gitster --commit c5a8f1e中合并,2020年9月29日)

docs:介绍如何处理始终被修改的文件

签名人:brian m。卡尔森

用户经常遇到两个文件名仅大小写不同的问题,从而导致其中一个文件在修改后始终显示。让我们添加一个常见问题解答条目,说明如何处理该问题。

此外,让我们解释另一种经常修改文件的常见情况,即使用污迹或干净过滤器的文件尚未通过该过滤器运行。
还要说明解决此问题的方法。

gitfaq现在包含在其man page中:

Why do I have a file that's always modified?

在内部,Git始终将文件名存储为字节序列,并且不存储 执行任何编码或大小写折叠。

但是,默认情况下Windows和macOS 都对文件名执行大小写折叠。
结果,有可能最终 多个文件或目录的名称仅大小写不同。

Git可以 可以很好地处理,但是文件系统只能存储这些文件之一, 因此,当Git读取另一个文件以查看其内容时,它看起来已修改。

最好删除其中一个文件,以便只有一个文件。您可以 使用以下命令执行此操作(假设两个文件AFile.txtafile.txt)放在干净的工作树上:

$ git rm --cached AFile.txt
$ git commit -m 'Remove files conflicting in case'
$ git checkout .

这可以避免触摸磁盘,但是会删除其他文件。
您的专案 可能更喜欢采用命名约定,例如全小写的名称,以避免 这个问题再次发生;可以使用 pre-receive挂钩或作为持续集成(CI)系统的一部分。

如果在以下任何情况下,永久修改的文件也可能出现在任何平台上: 系统上正在使用污迹或清洁的过滤器,但以前有一个文件 无需运行污迹或清洁过滤器的情况。
要解决此问题,请运行 在另外干净的工作树上进行以下操作:

$ git add --renormalize .