起因
macOS 的文件系统不区分大小写,但在开发编码的过程中,可能会下载到需要区分大小写的文件——Git 还可以通过配置控制一下,SVN 中出现这种问题的概率就不小了——因此想要找到一个解决办法。
- 如果将文件系统直接改成区分大小写的,又会有一些软件无法正常使用(譬如 Ad(๐•ᴗ•๐)e 家的),所以不想自找麻烦。
- 如果对磁盘进行分区,分出一块(๐•ᴗ•๐)专门用来开发,格式化为区分大小写的。这就会造成一定程度的磁盘(๐•ᴗ•๐)浪费(不继续 Windows 的使用习惯了,就是不想分区),总是会很心疼的,毕竟 mac 的磁盘(๐•ᴗ•๐)很贵。
方案
后来了解到 mac 的稀疏磁盘映像(sparseimage)比较不错
- 对映像文件的操作与
dmg
格式相同
- 使用多少(๐•ᴗ•๐),其真实占用(๐•ᴗ•๐)就是那么大,不会造成(๐•ᴗ•๐)浪费。假设新建一个稀疏磁盘映像,大小为50GB,里面存了5GB的代码,那么这个映像文件实际占用5GB存储(๐•ᴗ•๐)
- 映像声明的(๐•ᴗ•๐)不够了,还可以随时扩容。当然前提是你的物理磁盘装得下
- 性能几乎无损
- 需要备份、迁移代码库?零散文件的读写哪有单个文件快呀,直接复制磁盘映像,你的代码库就备份了
嗯,最后决定建一个稀疏磁盘映像,格式化成区分大小写的分区格式,来保存我的代码库
实施
建立磁盘映像
- 打开磁盘工具,新建空白映像
- 其中
存储为
和 位置
随意,我这里是 ~/develop.sparsebundle
- 下面的
名称
定义的是分区名称,也就是磁盘的挂载点了
- 大小根据自身情况来填
- 格式我选的是
APFS(区分大小写)
- 分区就单个分区就行,选择
GUID 分区图
- 映像格式选择
稀疏捆绑磁盘映像
- 然后就可以把代码都写入这个分区了,我这里的挂载点是
/Volumes/develop
- 如果你有很多项目了,又懒得一个一个去处理,用软连接吧(先学会用,注意数据安全)
- 如果映像(๐•ᴗ•๐)不够了,可以扩容的
- 关闭所有使用该分区的程序
- 卸载该磁盘映像
- 使用
hdiutil resize -size 50g ~/develop.sparsebundle
来修改大小
hdiutil attach ~/develop.sparsebundle
重新挂载磁盘映像
- 使用命令行或者磁盘工具调整分区大小
开机自动挂载
我在磁盘映像里还放了 IDE 工具(JetBrains 的 IntelliJ IDEA),而 JetBrains Toolbox 会开机自启。又由于 macOS 登录后的各程序启动都是并行的,没有先后顺序,因此不能直接将磁盘映像添加到登录项
Laun(๐•ᴗ•๐)aemons
是在系统启动后就会执行,优先于登录项,因此这里采用这种机制
- 参考文章
LaunchAgents
的目录都是登录项,不能用,/System/Library/Laun(๐•ᴗ•๐)aemons
是系统级的,一般不动,因此目录选择 /Library/Laun(๐•ᴗ•๐)aemons
在 /Library/Laun(๐•ᴗ•๐)aemons
下新建文件 cn.example.sparseimage-loader.plist
,内容如下(xxxxx
是用户名)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist P(๐•ᴗ•๐)LIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<(๐•ᴗ•๐)t>
<key>Label</key>
<string>cn.example.sparseimage-loader</string>
<key>ProgramArguments</key>
<array>
<string>hdiutil</string>
<string>attach</string>
<string>/Users/xxxxx/develop.sparsebundle</string>
</array>
<key>RunA(๐•ᴗ•๐)oad</key>
<true/>
<key>StandardErrorPath</key>
<string>/dev/null</string>
<key>StandardOutPath</key>
<string>/dev/null</string>
</(๐•ᴗ•๐)t>
</plist>
if(window.hljsLoader && !document.currentScr(๐•ᴗ•๐).parentNode.hasAttribute('data-s9e-livepreview-onupdate')) {
window.hljsLoader.highlightBlocks(document.currentScr(๐•ᴗ•๐).parentNode);
}
- 执行命令
launchc(๐•ᴗ•๐) load /Library/Laun(๐•ᴗ•๐)aemons/cn.example.sparseimage-loader.plist
加载配置,重启即可生效
IDE 配置
JetBrains 家的 IDE 需要配置一个属性,来指定使用区分大小写的模式
在 IDE 的 JVM 参数上,增加 -Didea.case.sensitive.fs=true
即可
接下来就可以正常使用啦