Windows环境下Git如何检出含特殊字符(如?)的文件且保留仓库原文件名
Windows本地Git适配含
?特殊字符文件名的配置方案 仅在当前Windows设备的本地仓库生效,不会修改远程仓库的原有文件名,也不会影响其他设备的使用。
配置步骤
- 先解除Git的NTFS文件名限制
打开终端进入本地仓库根目录,依次执行以下命令:
# 开启Windows长路径支持 git config --local core.longpaths true # 关闭Git默认的NTFS文件名合法性校验,允许检出含特殊字符的文件 git config --local core.protectNTFS false- 先解除Git的NTFS文件名限制
- 配置本地钩子实现文件名自动转换
Git钩子存储在本地仓库的.git/hooks目录下,不会被提交到远程仓库,完全满足本地配置的要求。 - 创建检出后钩子,实现检出时自动把文件名中的
?替换为合法的_:
新建.git/hooks/post-checkout文件,内容如下:#!/bin/sh # 遍历所有含?的文件,替换?为_ git ls-files | grep '?' | while read -r file; do new_file=$(echo "$file" | tr '?' '_') if [ -f "$file" ] && [ ! -f "$new_file" ]; then mv "$file" "$new_file" fi done - 创建提交前钩子,实现提交时自动把
_还原为原有文件名的?:
新建.git/hooks/pre-commit文件,内容如下:#!/bin/sh # 遍历所有替换过_的文件,还原为原文件名的?再提交 git ls-files | grep '?' | while read -r orig_file; do local_file=$(echo "$orig_file" | tr '?' '_') if [ -f "$local_file" ] && [ ! -f "$orig_file" ]; then mv "$local_file" "$orig_file" git add "$orig_file" fi done - 给两个钩子文件添加执行权限(Windows下用Git Bash执行即可):
chmod +x .git/hooks/post-checkout .git/hooks/pre-commit
- 配置本地钩子实现文件名自动转换
注意事项
- 如果你修改了替换过文件名的文件,提交前钩子会自动还原文件名后再提交,不会影响远程仓库的原有命名规则
- 该配置仅对当前本地仓库生效,如果需要应用到其他仓库,重复上述配置即可
- 如果文件名称本身同时存在
_和?,可以调整替换规则,选用文件名里不会出现的合法字符作为替换占位符即可
内容的提问来源于stack exchange,提问作者Archimedes Trajano
相关产品推荐
相关产品推荐

