Contents

1. 配置 Git 的 core.precomposeunicode 和 core.ignorecase

在不同操作系统中,文件系统对文件名的处理方式存在差异,比如大小写敏感性和 Unicode 字符的处理。你可以使用以下命令进行配置:

1
2
3
4
5
# 在 macOS 上,设置 Unicode 预组合字符
git config core.precomposeunicode true

# 在 Windows 和 macOS 上,忽略大小写
git config core.ignorecase true
  • core.precomposeunicode:在 macOS 上,这个配置项能确保 Git 正确处理 Unicode 字符,避免因字符编码问题导致文件名不一致。
  • core.ignorecase:在 Windows 和 macOS 上,文件系统默认不区分大小写,而 Linux 区分。设置此选项可以让 Git 在比较文件名时忽略大小写,防止因大小写不同而产生冲突。

2. 使用钩子脚本

Git 钩子是在特定事件发生时自动执行的脚本。你可以利用 pre-commit 钩子来检查提交的文件名是否包含跨平台不可用的字符。

创建 pre - commit 钩子脚本

在项目的 .git/hooks 目录下创建一个名为 pre-commit 的文件,并添加以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/bash

# 定义跨平台非法字符的正则表达式
INVALID_CHARS='[<>:"/\\|?*]'

# 获取所有即将提交的文件
files=$(git diff --cached --name-only)

for file in $files; do
    if [[ $file =~ $INVALID_CHARS ]]; then
        echo "错误: 文件名 '$file' 包含跨平台非法字符。"
        echo "请重命名文件以避免使用 < > : \" / \ \ | ? * 这些字符。"
        exit 1
    fi
done

exit 0

给脚本添加可执行权限

1
chmod +x .git/hooks/pre-commit

当你尝试提交包含非法字符的文件名时,这个钩子脚本会阻止提交,并给出相应的错误提示。