在 Windows 上更改文件的大小写? [复制]

Posted

技术标签:

【中文标题】在 Windows 上更改文件的大小写? [复制]【英文标题】:Change case of a file on Windows? [duplicate] 【发布时间】:2010-12-20 02:34:16 【问题描述】:

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

如何让 Windows 和 Git 识别并签入该更改?

【问题讨论】:

从 Git 2.0.1+(2014 年 6 月)开始,一个简单的 git mv 应该可以工作(***.com/a/24979063/6309)。即使在 Windows 上。 这个问题与声称的重复问题不同:“How to make git ignore changes in case?” 【参考方案1】:

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

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

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

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

【讨论】:

真正最简单的。 这会丢失文件的整个历史记录,因为它被 git 设置为一个全新的文件。 @Alejandro 你说的不对。我刚刚对其进行了测试,git 识别出重命名没有任何问题。与其他情况一样,该文件在索引中显示为已删除/新建,但在提交时,git 注意到它刚刚被重命名。 在我的场景中,文件名的大小写在 Linux 机器上发生了更改,我的 Windows git 无法处理它。 windows 目录的“git add”导致两个文件名变体出现在 git 索引中。之后,我不得不从我的 Windows git 缓存中删除这两个变体,然后添加我想要保留的那个。例如。 “git rm --cached abc.js Abc.js; git add Abc.js”。【参考方案2】:

对于 NTFS(或 FAT),单个 git mv 命令不能解决问题。 这个问题显示了一种有效的技术: git mv and only change case of directory

【讨论】:

【参考方案3】:

小心。这样做可能会导致无法合并的更改。 Git 在 Windows 上合并时会感到困惑,因为它无法确定旧的大写名称和新的小写名称是否是同一个文件(对于 Git,它们不是,但对于文件系统它们是)。要合并,您必须执行一些手动解决方法,例如在合并之前删除文件。

见Git rebase issue with files of same name but different case

我不确定这个问题是否比你的项目中永远存在一个非常规命名的文件更糟糕,但值得了解的是是否有很多用户拥有很多分支,这些分支都需要最终合并。

【讨论】:

如果可能,应尽可能避免在大中型项目中使用非常规命名的文件,因为在为多个平台开发时会导致问题(延迟修复类似的问题,直到以后会导致修复的问题更加严重) .有时您在 Windows 上进行开发,但还需要进行 linux 构建,而在 Windows 上可以正常工作的包含会导致构建在 linux 上中断。【参考方案4】:

如果您使用的是 FAT 文件系统,您唯一的选择是进行两阶段重命名:

    sourceCode.java 重命名为anything.you.likeanything.you.like 重命名为SourceCode.java

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

【讨论】:

只是给其他人的说明:中间不需要提交,但需要添加到索引以便git注意到更改【参考方案5】:

以下步骤允许我在 Windows 上更改大小写:

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

这样你就有一个包含重命名的提交,并且它可以很容易地改变例如整个目录。

【讨论】:

为浴全局和本地设置执行此操作:$ gti config --global core.ignorecase false $ gti config core.ignorecase false 如果之前已经设置了任何特定值,则使其适用于所需的 repo(如果您知道没有进行任何特殊设置,则可以跳过),并在全局范围内使其成为新存储库的规则。跨度> 【参考方案6】:

在此处查看有关如何操作的更多提示:

How to make git ignore changes in case?

或者:

git mv -f name.java Name.java

【讨论】:

顺便说一句,这不适用于 FAT 文件系统。我在拇指驱动器上随身携带一些项目代码,而更改案例真的很痛苦。 这在 NTFS 系统和 Windows 10 上对我不起作用 这当然是正确的方法,但是,如果您需要重命名很多文件,它可能会很乏味。如果您已经以某种方式在文件系统中将它们重命名并且您只想提交这些更改,您可以重命名一些父文件夹,对新重命名的文件夹执行git add,不要提交,将文件夹名称更改回应该是,git add 再次提交。 适用于 NTFS 和 Windows 7。 是否可以批量执行此操作?例如使用 powershell,Get-ChildItem '.' | Rename-Item $_.Name.ToLowerCase()

以上是关于在 Windows 上更改文件的大小写? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何仅复制已存在的目标文件上更改的文件内容?

Windows上的Git:重命名文件后无法切换分支(仅更改大小写)

在 Windows 命令行中更改文件夹权限? [复制]

更改缓冲区大小以在 C 中复制文件

如何更改 Angular Material 上 mat-icon 的大小? [复制]

为啥在 Windows 和 Linux 机器之间复制 repo 后 Git 会指示更改?