使用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 --version
是2.1.2
Foo.js
都消失了,我只有foo.js
?答案 0 :(得分:2)
使用&#39; git revert&#39;在该提交中,您包含了文件的重命名版本。 然后,您可以[正确]重命名文件 - 正如您在描述中所指出的那样 - 并创建一个新提交。
正确重命名文件的示例:
git mv --force Foo.js foo.js
答案 1 :(得分:0)
Git 2.29(2020年第四季度)添加了另一种处理这种情况的方法:
请参见commit 087c616的commit 409f066,commit 5065ce4,brian 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.txt
和afile.txt
)放在干净的工作树上:$ git rm --cached AFile.txt $ git commit -m 'Remove files conflicting in case' $ git checkout .
这可以避免触摸磁盘,但是会删除其他文件。
您的专案 可能更喜欢采用命名约定,例如全小写的名称,以避免 这个问题再次发生;可以使用pre-receive
挂钩或作为持续集成(CI)系统的一部分。如果在以下任何情况下,永久修改的文件也可能出现在任何平台上: 系统上正在使用污迹或清洁的过滤器,但以前有一个文件 无需运行污迹或清洁过滤器的情况。
要解决此问题,请运行 在另外干净的工作树上进行以下操作:$ git add --renormalize .