如何阻止Git同步文件时自动修改文件权限?
解决Git拉取后文件权限变更的问题
Git默认只跟踪文件的可执行权限位(用户级的x位),其余权限(组/其他用户的r/w/x)不会被仓库记录。拉取文件时,Git会根据本地系统的umask值生成默认权限,这就是你遇到权限变更的核心原因。你之前尝试的core.sharedRepository是针对多人共享本地仓库的权限配置,和远程推送拉取的场景无关,因此无效。
以下是几种解决方法,根据你的需求选择:
方法1:确保Git跟踪可执行位(基础配置)
这个配置能让Git识别并保留文件的可执行状态,拉取后文件会保持可执行属性:
# 全局生效(所有仓库) git config --global core.fileMode true # 仅当前仓库生效 git config core.fileMode true
方法2:调整本地umask统一权限
如果希望拉取后的文件直接获得rwxrwxrwx(可执行)或rw-rw-rw-(普通)权限,可以修改本地的umask值:
- 临时生效(仅当前终端会话):
umask 000
- 永久生效(添加到shell配置文件):
编辑~/.bashrc或~/.profile,加入:
umask 000
保存后执行source ~/.bashrc生效。这样拉取时,普通文件会默认是rw-rw-rw-,可执行文件会是rwxrwxrwx。
方法3:用.gitattributes批量自定义权限
如果仓库里有大量不同权限要求的文件,可以通过.gitattributes配合Git过滤器自动设置权限:
- 在仓库根目录创建
.gitattributes文件,添加对应文件的规则:
# 给所有.sh文件设置777权限 *.sh filter=set-sh-perm # 给所有.py文件设置755权限 *.py filter=set-py-perm # 给所有.txt文件设置666权限 *.txt filter=set-txt-perm
- 配置Git过滤器:
# 配置.sh文件的权限过滤器 git config filter.set-sh-perm.smudge 'chmod 777 %f' git config filter.set-sh-perm.clean 'chmod 777 %f' # 配置.py文件的权限过滤器 git config filter.set-py-perm.smudge 'chmod 755 %f' git config filter.set-py-perm.clean 'chmod 755 %f' # 配置.txt文件的权限过滤器 git config filter.set-txt-perm.smudge 'chmod 666 %f' git config filter.set-txt-perm.clean 'chmod 666 %f'
配置完成后,每次拉取(smudge阶段)和提交(clean阶段)时,对应文件会自动应用设定的权限。
内容的提问来源于stack exchange,提问作者Soroush
相关产品推荐
相关产品推荐

