在我们的git控制的代码库中,有几个文件我想重命名。具体来说,我只想更改文件的大小写,例如,将sourceCode.java变成sourceCode.java。问题是:我在Windows机器上,文件系统认为它们是相同的文件名。
我如何让Windows和Git识别这个更改并检入? 文件名的变化不应该被忽略,而是提交给git。
在我们的git控制的代码库中,有几个文件我想重命名。具体来说,我只想更改文件的大小写,例如,将sourceCode.java变成sourceCode.java。问题是:我在Windows机器上,文件系统认为它们是相同的文件名。
我如何让Windows和Git识别这个更改并检入? 文件名的变化不应该被忽略,而是提交给git。
当前回答
小心些而已。这样做可能会导致无法合并的更改。Git在Windows上合并时会感到困惑,因为它不能确定旧的大写名称和新的小写名称是否是同一个文件(对于Git来说不是,但对于文件系统来说是)。要合并,你必须做一些手工工作,比如在合并之前删除文件。
见Git rebase问题与文件相同的名称,但不同的情况
我不确定这个问题是否比在你的项目中永远有一个非常规命名的文件更糟糕,但如果有大量的用户和大量的分支最终都需要合并是值得知道的。
其他回答
下面的步骤允许我在Windows上更改外壳:
在.git/config中添加ignorecase = false到[core]; 将你要重命名的文件移出你的项目目录; 将删除添加到索引中; 将所有文件移回原始位置,并更改文件和/或目录的大小写; 将所有“new”文件添加到索引中; 删除第一步添加的ignorecase = false。
这样你就有了一个包含重命名的单一提交,它使更改例如整个目录变得很容易。
要重命名文件,可以使用标准的git mv命令。 由于Windows将只有大小写变化的文件视为相同的文件,你必须传递-f选项来强制重命名:
git mv -f name.java Name.java
如果您想忽略大小写更改,请查看问题 如何使git忽略变化的情况下?。
小心些而已。这样做可能会导致无法合并的更改。Git在Windows上合并时会感到困惑,因为它不能确定旧的大写名称和新的小写名称是否是同一个文件(对于Git来说不是,但对于文件系统来说是)。要合并,你必须做一些手工工作,比如在合并之前删除文件。
见Git rebase问题与文件相同的名称,但不同的情况
我不确定这个问题是否比在你的项目中永远有一个非常规命名的文件更糟糕,但如果有大量的用户和大量的分支最终都需要合并是值得知道的。
对于NTFS(或FAT),单个git mv命令不能解决问题。 这个问题展示了一个有效的技巧: Git mv,只更改目录的大小写
如果你在一个FAT文件系统上,你唯一的选择是做一个两阶段重命名:
将sourceCode.java重命名为你喜欢的任何名称 将任何。你喜欢的重命名为SourceCode.java
在使用Perforce的时候,我们遇到了这样的问题,这是我们能想到的唯一解决方案。