在Windows上更改文件的情况?

在我们的git控制的代码库中,有几个文件我想重命名。具体来说,我只想改变文件的大小写,例如,让sourceCode.java变成SourceCode.java。问题是:我在Windows机器上,文件系统认为它们是相同的文件名。

我如何才能让Windows和Git识别这个更改并检入? 文件名的变化不应该被忽略,而是提交给git
65023 次浏览

如果你在一个FAT文件系统上,你唯一的选择是做一个两阶段重命名:

  1. sourceCode.java重命名为anything.you.like
  2. anything.you.like重命名为SourceCode.java

在使用Perforce的时候,我们遇到了这样的问题,这是我们能想到的唯一解决方案。

要重命名文件,可以使用标准的git mv命令。 由于Windows将只有大小写变化的文件视为相同的文件,您必须传递-f选项来强制重命名:

git mv -f name.java Name.java
如果你想忽略大小写变化,请看问题 如何使git忽略变化的情况下? . < / p >

下面的步骤允许我在Windows上更改外壳:

  • ignorecase = false添加到.git/config中的[core];
  • 将你要重命名的文件移出你的项目目录;
  • 将删除添加到索引中;
  • 将所有文件移回原始位置,并更改文件和/或目录的大小写;
  • 将所有“new”文件添加到索引中;
  • 删除第一步中添加的ignorecase = false

这样你就有了一个包含重命名的单一提交,它使更改例如整个目录变得很容易。

小心些而已。这样做可能会导致无法合并的更改。Git在Windows上合并时会感到困惑,因为它不能确定旧的大写名称和新的小写名称是否是同一个文件(对于Git来说不是,但对于文件系统来说是)。要合并,你必须做一些手工工作,比如在合并之前删除文件。

看到Git用相同名称但不同情况的文件重基问题

我不确定这个问题是否比在你的项目中永远有一个非常规命名的文件更糟糕,但如果有大量的用户和大量的分支最终都需要合并是值得知道的。

对于NTFS(或FAT),单个git mv命令不能解决问题。 这个问题展示了一个有效的技巧: Git mv,只更改目录的大小写 < / p >

在我看来,缺少一种简单的方法。您可以为单个文件、特定目录甚至整个存储库执行此操作。只要用你喜欢的方式重命名你的文件,然后执行这些命令:

git rm --cached <file name or directory>
git add <file name or directory>

如果你也想影响子目录,你必须使用-r标志:

git rm -r --cached <directory>
git add <directory>