我如何更改已提交的多个文件名的大小写?

问题描述 投票:1回答:2

我想将我在Git上上传的所有500张图像重命名为小写。

如果我使用小写图像推送代码,Git将忽略大小写。有没有特定的命令可以解决?

git macos filenames
2个回答
1
投票

如果我使用小写图像推送代码,Git将忽略大小写...

这实际上不是真的。

为了正确理解问题,您需要了解以下内容:

  • Git不存储文件,而是commits

  • 提交do存储文件,但not与计算机正常运行的方式相同。提交中存储的文件始终具有区分大小写的名称。

  • git push发送commits

从这个意义上讲,Git完全能够用新提交Y中新的仅小写名称替换提交X中的所有大写字母名称,同时使每个文件的所有内容保持不变。也就是说,在提交X中,您将找到文件X:PATH/TO/FOO.JPG,而在提交Y中,文件Y:path/to/foo.jpg将与早期的文件“相同”,除了以下事实:名称现在全部小写而不是大写。

请注意,提交中的文件路径很长,其中似乎包含文件夹名称。就Git而言,它们仍然只是具有这些长路径的文件。您的计算机要求首先创建一个名为path文件夹,然后在path中创建另一个名为to的文件,以便可以在其中创建一个名为foo.jpg的文件。您将以path/to/foo.jpg的身份访问...好吧,这是您的计算机的问题; Git将尽最大努力适应它。

这也是名称框问题所在。您的计算机坚持认为,名为PATH的文件夹和名为path的文件夹是相同文件夹。两者兼而有之!如果您尝试在名为to的文件夹中创建一个名为path的新文件夹,并且名为PATH的文件夹存在,则您的computer坚持将名为to的文件夹放入名为PATH的文件夹中]。更糟糕的是,如果名为TO的文件夹存在于名为PATH的文件夹中,则您的计算机坚持使用该文件夹,而不是创建一个新文件夹。

如果这两个都没有,您的计算机将继续创建path,然后创建path/to。因此,1的一种选择是删除 PATH/TO中的所有内容,完全删除文件夹TO,然后删除PATH中的所有内容,然后完全删除文件夹PATH。现在,Git可以创建pathpath/to

[path/toPATH/topath/TOpAtH/tO或其他发生的一切,现在假设Git想要在此文件夹中创建或修改名为foo.jpg的文件。如果没有使用该名称的文件,则您的计算机很乐意创建一个新文件并保留全小写名称,以便在其中包含foo.jpg。但是,如果已经有一个名为FOO.JPG的文件,则任何尝试创建新的foo.jpg并对其进行写入的尝试都只会写入现有的FOO.JPG,该文件将保留其喧闹的大写名称。

换句话说,这不是Git's>]问题。这是您的计算机的问题。当然,Git正在您的计算机上运行,​​这使其成为您和Git所要解决的问题。但是重要的是要了解这里到底出了什么问题:这是您的计算机而不是Git对您执行此操作。如果我们让您的Mac停止对您这样做,问题就会消失:文件名突然出现[[matters,Git认为应该的方式,其他一切都可以正常使用。


1

显然,您还有其他选择:例如,您可以将PATH重命名为I_LIKE_YELLING_PATH,从而保留所有现有文件。最终,您可以将其重命名,或将文件移出其中,或进行其他操作。
最简单的解决方法是使用不折叠大小写的文件系统

[在Mac上,您可以启动一个运行Linux的VM(例如,参见https://apple.stackexchange.com/questions/264527/linux-vm-installation-on-macbook-pro-with-macos-sierra-10-12,它很旧,但可能仍然可以运行;我有一个带VirtualBox的Linux VM,可以在这台特定的笔记本电脑上用于各种操作) )。缺省的Linux文件系统不认为READMEReadMe是同一文件,而是允许您将

both文件放入文件系统。 Git在这里真的很好用,这可能不足为奇。((据我所知,VM也可以在Windows上很好地运行,并且可能是去那里的最简单的方法。不过,我不“使用” Windows。)

您还可以制作不折叠文件的系统。我不建议将主文件系统重新设置为区分大小写的格式(请参见https://superuser.com/questions/203896/case-sensitive-folder-names-in-os-x),但是您可以制作可安装的映像,也可以使用USB记忆棒。例如,使用“磁盘工具”创建一个新的空白映像。将其命名为case-sensitive,这将是.dmg文件的名称,并将其放置在您可以轻松到达的位置,例如DesktopDownloads。使其足够大,例如1 GB应该足够。对于Format,选择

区分大小写

文件系统,例如Mac OS Extended (Case-sensitive, Journaled)making case sensitive journaled fs

也更改Name字段,就在Size上方(我在截屏时忘记了这样做)。也就是说,Save As应该是.dmg文件的一个易记的名称,并且Name应该是您希望磁盘在每次安装时都显示在/Volumes中的位置。单击Save,完成后,单击Done按钮关闭弹出窗口。

您现在可以随时挂载此文件系统(Disk Utility现在已经完成;以后,只需双击.dmg文件),然后在“终端”窗口或选项卡中使用cd /Volumes/case-sensitive。在这里,您可以克隆并使用区分大小写的存储库,而不必担心大小写。

现在您具有区分大小写的本地文件系统,克隆存储库并重命名文件

cd /Volumes/case-sensitive git clone <url> cd <clone>/<path>

您现在可以重命名了。有很多方法可以做到这一点。请参阅VonC's answer以获取bash脚本示例。这是一个可在MacOS上运行的/bin/sh shell片段:

for name in *.JPG; do lc=$(echo $name | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/') echo git mv $name $lc done

运行一次以确保您喜欢该产品,然后再次移除echo以使其实际上发出git mv命令。

我自己的首选方法是将文件名转储到/tmp文件中:

ls *.JPG > /tmp/x # note: ls, not echo, to get one per line

然后在/tmp中将vim文件编辑为正确的命令系列:

vim /tmp/x :%s/.*/git mv & \L&/

一旦结果看起来正确,我将写出临时文件并退出(ZZ:x),然后执行它。完成后将其删除:

sh /tmp/x rm /tmp/x

您现在可以在git commit中此区分大小写的文件系统中,从此区分大小写的目录中进行git push/Volumes/case-sensitive所需的任何其他更改。

((一旦完成了区分大小写的文件系统.dmg文件,就可以像对待任何.dmg文件一样将其弹出和删除。您也可以将其保留任意长时间,如果没有占用太多空间。)


0
投票
待处理--pathspec-from-file(缓慢为added to some commands with Git 2.25, but not git mv yet),您需要编写脚本
© www.soinside.com 2019 - 2024. All rights reserved.