我想将我在Git上上传的所有500张图像重命名为小写。
如果我使用小写图像推送代码,Git将忽略大小写。有没有特定的命令可以解决?
如果我使用小写图像推送代码,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可以创建path
和path/to
。
[path/to
或PATH/to
或path/TO
或pAtH/tO
或其他发生的一切,现在假设Git想要在此文件夹中创建或修改名为foo.jpg
的文件。如果没有使用该名称的文件,则您的计算机很乐意创建一个新文件并保留全小写名称,以便在其中包含foo.jpg
。但是,如果已经有一个名为FOO.JPG
的文件,则任何尝试创建新的foo.jpg
并对其进行写入的尝试都只会写入现有的FOO.JPG
,该文件将保留其喧闹的大写名称。
换句话说,这不是Git's>]问题。这是您的计算机的问题。当然,Git正在您的计算机上运行,这使其成为您和Git所要解决的问题。但是重要的是要了解这里到底出了什么问题:这是您的计算机而不是Git对您执行此操作。如果我们让您的Mac停止对您这样做,问题就会消失:文件名突然出现[[matters,Git认为应该的方式,其他一切都可以正常使用。 1PATH
重命名为I_LIKE_YELLING_PATH
,从而保留所有现有文件。最终,您可以将其重命名,或将文件移出其中,或进行其他操作。
最简单的解决方法是使用不折叠大小写的文件系统
README
与ReadMe
是同一文件,而是允许您将both文件放入文件系统。 Git在这里真的很好用,这可能不足为奇。((据我所知,VM也可以在Windows上很好地运行,并且可能是去那里的最简单的方法。不过,我不“使用” Windows。)
您还可以制作不折叠文件的系统。我不建议将主文件系统重新设置为区分大小写的格式(请参见https://superuser.com/questions/203896/case-sensitive-folder-names-in-os-x),但是您可以制作可安装的映像,也可以使用USB记忆棒。例如,使用“磁盘工具”创建一个新的空白映像。将其命名为case-sensitive
,这将是.dmg
文件的名称,并将其放置在您可以轻松到达的位置,例如Desktop
或Downloads
。使其足够大,例如1 GB应该足够。对于Format
,选择
区分大小写
文件系统,例如Mac OS Extended (Case-sensitive, Journaled)
:也更改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
文件一样将其弹出和删除。您也可以将其保留任意长时间,如果没有占用太多空间。)
--pathspec-from-file
(缓慢为added to some commands with Git 2.25, but not git mv
yet),您需要编写脚本