存在已暂存变更时部分Git客户端无法应用stash的原因是什么
问题根因
这种不同客户端的行为差异,本质是原生C实现的Git和**JGit(Java实现的Git类库)**的stash apply前置校验逻辑不同导致的:
- 原生Git(Git Bash、SourceTree默认调用系统原生Git)执行
git stash apply时会做三方合并校验,只要stash修改的文件和当前暂存区、工作区修改的文件没有重叠,即便暂存区存在未提交的变更,也能正常应用stash,不会报错。 - EGit、GitKraken以及你们正在开发的客户端都基于JGit实现,旧版本JGit的
StashApplyCommand有严格的前置校验:只要检测到当前暂存区存在未提交的变更,不管变更文件和stash涉及的文件是否独立,都会直接抛出冲突错误,拒绝应用stash。
基于JGit开发的适配方案
如果要实现和原生Git一致的用户体验,可选择两种方案:
- 升级JGit版本到6.4及以上:该版本后JGit官方已经优化了
stash apply的校验逻辑,和原生Git对齐,只要变更文件无重叠即可正常应用stash。 - 自定义兼容逻辑:如果暂时无法升级JGit版本,可在调用
StashApplyCommand前增加前置校验:分别提取当前暂存区的变更文件列表、待应用stash的变更文件列表,确认两个列表无重叠后,先将当前暂存区的变更临时存储为tree对象,应用完stash后再恢复临时存储的暂存变更即可。
内容的提问来源于stack exchange,提问作者Sorin Adrian Carbunaru
相关产品推荐
相关产品推荐

