文件没有更改,但git status显示modified

背景

在windows下编辑某个项目代码时,编辑到一半,需要切换到另一个分支,直接转换会提示当前工作区还有已修改的文件尚未commit,但是当前更改的内容尚未完整,所以还不想commit到仓库中。所以就使用了git stash save命令将当前工作区缓存后,才能切换到其他分支。
但是在checkout回到自己分支使用git stash apply时。发现不能将stash中的内容恢复,报错显示有文件已modified,即使使用girl restore xxx也没办法将文件的modified状态消除。

问题排查

  • 首先,因为确认没有对文件做了什么修改,所以我一开始先直接使用git restore命令将文件恢复到上次提交的内容,但是发现没有什么用,文件还是处于modified状态
    git restore example/example.py
    
  • 接着,我使用git diff --summary对比modified文件到底发生了什么变化
    $ git  diff --summary
    mode change 100755 => 100644 example/example.py
    
    根据提示,发现是文件的权限发生了改变,参考中的方式,在git bash中运行了以下命令,但是没起作用,不知道是不是因为是系统是windows的原因
    git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | tr '\n' '\0' | xargs -0 chmod +x
    
  • 最后,通过git config --list才发现,config中有一条filemode配置项,该配置项被设置为了true状态
    $ git config --list
    ...
    core.filemode=true
    ...
    
    修改该配置项的值为false, 文件的modified状态消失了。
    git config core.filemode false
    
    这样设置作用范围仅针对当前工作区,如果想要全局生效,则需要添加--global选项
    git config --global core.filemode false
    

总结

  • 先用git diff --summary查看文件具体发生了什么改变
  • 这里是checkout切换后文件权限发生了变化导致的,需要修改git的配置文件,需要设置将文件权限检测功能关闭,即git config core.filemode false;如果需要全局生效,则git config --global core.filemode false
  • 其他类似的,因文件名发生改变导致的需要配置git config core.filename false; 因LF/CRLF原因导致的需要配置git config core.autocrlf false

参考

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值