一、Gitee相关
复现步骤:
自己在gitee上使用WEB解决冲突,本地未拉取最新的origin分支,然后本地也做了其他的修改,然后commit并且push,push时候报错,本地分支不干净
尝试拉取origin的最新内容,报错:
error: cannot lock ref 'refs/remotes/origin/UpdateXXXX': is at 706046d1d596c84f39ff3—— but expected 6bc88f583cf894441db44d46—— ! 6bc88f583..4589174aa UpdateXXXX -> origin/UpdateFBPP (unable to update local ref)
尝试方案:
git fetch origin
依旧报错:
git did not exit cleanly (exit code 1) (8906 ms @ 2024/2/26 14:48:32)
尝试清理引用失败。
git fetch --prune origin
尝试删除lock文件,没有找到.lock文件,尝试失败
成功方案:
git gc
执行git垃圾回收
二、更新子模块无法与远程保持一致
解决冲突时错误推送子模块,之后更新子模块无法和远程保持一致。
复现步骤:
在有冲突的时候拉取远程代码,并解决冲突,冲突可能发生在子模块上,或者没有。然后commit,然后更新子模块:
git submodule update --progress --init
查看本地子模块状态:
git submodule status
然后比较远程子模块的哈希值,发现并不对应,并且此时更新子模块无效。
尝试方案:
此时不限于拉取远程最新代码,fetch,pull远程代码。更新子模块全部维持不一致。
成功方案:
方案一:拉取代码解决冲突后,应该执行更新子模块,然后再commit解决冲突的commit记录。
方案二:
先找到远程父仓库的子模块哈希值,然后把本地子模块更新到子模块远程最新的哈希值,然后
将本地子模块的哈希值重置为远程主仓库记录的哈希值。
具体操作为:
git ls-tree HEAD path/to/submodule
git submodule update --remote --merge
git add path/to/submodule
git commit -m "重置子模块哈希值"
原因分析:
其实在使用git更新子模块时,我们使用
git submodule update --progress --init
,这个命令只会初始化子模块并更新到与父仓库一致的状态,而不会是寻找主仓库最新的涉及到依赖库的commit记录,根据记录中关于依赖的更新记录来决定的,如果本地落后于远程,就会使用远程的,和远程保持一致,如果本地“领先”于远程,即使这种领先是错误解决冲突导致,也会覆盖。所以在解决冲突后经常会“失效”。
注意这里的父仓库,如果指定过tracked_branch,会使用这个作为superproject,如果没有,会使用本地的作为superproject
三、使用git ls-tree无法查看远程子模块的信息
在对本地使用这个命令的时候有效
git ls-tree HEAD QYCAM/cam-dependency/
复现步骤:
直接调用显示无效
git ls-tree upstream/develop_311 cam-dependency/
尝试方案:
路径写成path/to也不行
成功方案:
即使是远程使用的路径也是相对路径,相对的是执行命令是当前工作路径的相对位置,因为本地和远程是一致的,所以可以使用。