有可能出现这种情况,我们从git仓库拷贝到本地之后,修改了本地这些拷贝的文件权限,然后push到远程仓库。这时候,远程仓库的项目文件权限也会发生改变,因为git默认把文件权限也纳入版本控制,所以不要以为本地权限的变更不会影响远程仓库。
解决办法是:
先备份当前代码到本地一个新的目录A,选取一个最近的权限正确的版本号,记录下该版本之后每次commit发生改变的文件到记事本
git reset --hard 版本号
回退到权限正确的时候的版本,然后根据记事本上记录的发送变动的文件,用A目录下的这些文件直接替换(overrite,不要只是替换文件内容,直接用文件替换)当前的对应文件。
确保全部都替换完毕之后,我们无法直接push,因为当前版本落后远程仓库多次提交,我们要git pull获取所有最新提交之后才能push。-----这也算是git的机制,所以我们不必担心忘记git pull直接git push的情况,因为远程仓库一旦有了新的commit,不git pull是无法git push成功的。
但是这时我们如果直接git pull那么文件权限会变成pull之后的情况,权限还是不正确。这时不要使用git push -f的形式,因为该形式会删除远程仓库上本版本之后的每次commit,这样我们无法git reset的方式回退到这些版本。当然,如果确定把那些后面的commit都迁移到这回的回退上面,也可以这么做。
光有解决办法还不够,我们需要预防办法:
在我们第一次git clone远程仓库代码到本地的时候,就直接把文件权限从git版本控制中移除。