MacOS环境下拉取Git develop分支后自动出现文件删除状态的原因咨询
这种情况我之前在MacOS上处理过好几次,结合Git的工作逻辑和MacOS文件系统的特性,主要有这几个常见原因:
远程分支存在删除文件的提交
你拉取前本地仓库是干净的,但远程的develop分支可能在你上次同步之后,有其他开发者提交了删除这两个文件的变更。git pull本质是git fetch + git merge的组合操作,拉取远程最新提交后,合并过程会自动把远程的删除操作同步到你的本地工作区——这时候本地的对应文件会被删除,git status自然会显示它们为已删除状态。
你可以用git log --oneline develop..origin/develop查看本地和远程分支的差异提交,或者直接用git diff develop origin/develop对比文件变更,确认是不是有删除这两个文件的提交。MacOS文件系统大小写不兼容
Git默认是严格区分文件名大小写的,但MacOS的默认文件系统(APFS)默认是不区分大小写的(除非你格式化磁盘时特意开启了大小写敏感)。如果远程分支里的这两个文件被修改了大小写(比如MyFile.txt改成了myfile.txt),在MacOS上系统会把这两个文件名视为同一个文件,但Git会认为原来的文件被删除、新的文件被创建。这时候你可能看不到本地文件实际被删除,但git status会标记原文件名的文件为已删除。
你可以检查远程分支的文件名变化,或者临时执行git config core.ignorecase false开启Git的大小写敏感(注意:这个操作可能导致本地其他大小写相关的文件冲突,用完建议改回默认),然后重新拉取验证。稀疏检出(Sparse Checkout)配置变更
如果你的仓库开启了稀疏检出功能(只检出仓库中的部分文件/目录),之前的配置可能包含这两个文件,但远程分支的最新提交修改了稀疏检出规则,或者这两个文件被移出了检出范围。当你执行git pull后,Git会自动删除本地工作区中不在稀疏检出范围内的文件,从而在git status中显示为已删除。
你可以用git config --get core.sparseCheckout查看是否开启了该功能,如果返回true,再检查.git/info/sparse-checkout文件的内容,确认这两个文件是否还在检出列表中。Git钩子自动执行了删除操作
仓库的.git/hooks目录下可能存在post-merge或post-checkout钩子脚本,这些脚本会在git pull完成后自动运行。如果脚本中包含删除这两个文件的逻辑,就会导致拉取后文件被自动删除,进而在git status中显示变更。
你可以打开.git/hooks目录,查看有没有启用的钩子脚本(文件名不带.sample后缀的就是启用的),检查脚本内容是否有相关删除操作。
快速排查步骤
- 先执行
git fetch origin develop拉取远程最新代码,不进行合并; - 用
git diff develop origin/develop对比本地和远程分支的文件差异,确认是否有删除操作; - 根据上面的几个原因,逐一排查大小写、稀疏检出、钩子等配置。
内容的提问来源于stack exchange,提问作者Akshay Vijay Jain

