Notes.

解决 git 仓库文件在 Macos 文件系统的重命名冲突的问题。

2021-01-04 • ☕️ 2 min read

背景

  1. Macos(Windows)默认文件系统是大小写不敏感的(case-insensitive)的,即:目录Appapp在 Macos 看来是同一个。
  2. Linux 系统采用的是大小写敏感(case-sensitive)的文件,即:目录Appapp在 Linux 看来是不同的文件系统,可以共存。

问题复现

  1. 创建一个新仓库,配置远程仓库 (gitlab or github)
cd ` mktemp -d`
git init
git remote add origin git@xxxx.com
  1. 创建任意小写字母命名的目录并提交
mkdir app
cd app && touch index.js && git push
  1. 配置 git 大小写敏感并将目录名改为大写
# 配置git大小写敏感
git config core.ignorecase false

mv app App && git push

此时,gitlab 上就会出现 Appapp 两个同名的目录。

image.png

原因分析

将 git 的大小写敏感开启后,如果用文件系统工具 mv 将 a 重命名为A后,文件系统并不会认为文件发生了变化,git 也不会认为是进行了文件重命名,而是认为新增了文件。

这样提交后,就会导致远程仓库有两份文件aA

如何解决

此种问题最简单的处理办法是在 Linux 下进行文件名的重新校正。

如果没有 Linux 环境,在 Macos 下也是可以的,就是比较麻烦,需要用磁盘工具创建一个对大小写敏感的磁盘镜像并挂载,然后将仓库重新 clone 到此磁盘镜像中并进行文件名的校准。

  1. 创建磁盘镜像
# 创建一个文件系统为敏感的HSF+,容量1G的大小稀疏磁盘镜像
hdiutil create -size 1g -fs "Case-sensitive Journaled HFS+" -type SPARSE -volname Projects ~/Projects.dmg
  1. 挂载磁盘镜像
# 挂载
hdiutil attach ~/Projects.dmg.sparseimage
# 设置 /Volumes/Projects/ 下文件可见
sudo setfile -a V /Volumes/Projects/
# 重启 finder
killall Finder
# 创建目录
mkdir /Volumes/Projects/projects/
  1. 克隆仓库 & 文件名校准
git clone git@xxx.com
# 文件名校准
rm -rf ....
  1. 提交

复盘:如何规避此类问题?

利用 git 自带的文件夹命名工具git mv进行操作(可不用配置 git 大小写敏感),但是要注意:在对大小写不敏感的文件系统上,需要设置缓存文件,like this:

git mv test temp && git mv temp Test

参考资料


Natumsol

Personal blog by Natumsol.
Note thoughts and experience.