Bug
在 qtcloud-devops code status 中,当子模块的 local_head 领先于 remote_head(即本地有未推送提交、且父仓库记录的指针恰好等于 local_head)时,behind_count 会错误地回溯到根 commit,显示大量虚假的"落后"提交数。
复现步骤
- 在子模块中创建 1 个本地提交,但不推送
- 父仓库记录该子模块指针为
local_head
- 运行
qtcloud-devops code status
实际结果
status 显示 冲突(落后 N 提交),其中 N 是 local_head 到根 commit 的父链总长度(非 local_head..remote_head 的实际距离)。
期望结果
当 local_head 领先于 remote_head 时,behind_count 应为 0,status 应为 AheadOfParent(待推送)。
根因
git.rs 中 scan_single_submodule 第 396-407 行:
let ahead = sm_repo
.as_ref()
.map(|r| gix_count_between(r, *parent_pointer, local_head))
.unwrap_or(0);
let behind = if remote_unreachable {
0
} else {
sm_repo
.as_ref()
.map(|r| gix_count_between(r, local_head, remote_head))
.unwrap_or(0)
};
gix_count_between(from, to) 只单向从 to 往 parent 回溯,直到遇到 from。但如果 local_head 是 remote_head 的后代(即本地领先),回溯永远不会遇到 local_head,会一直走到根 commit 才停下,导致 behind 被错误地设置为整个历史长度。
修复建议
在 scan_single_submodule 中计算 behind 前先判断 local_head 是否为 remote_head 的祖先(用 gix_count_between(local_head, remote_head) 能否到达 local_head),若不是则 behind = 0。is_orphaned 的判断也需考虑这种情况。
Bug
在
qtcloud-devops code status中,当子模块的local_head领先于remote_head(即本地有未推送提交、且父仓库记录的指针恰好等于local_head)时,behind_count会错误地回溯到根 commit,显示大量虚假的"落后"提交数。复现步骤
local_headqtcloud-devops code status实际结果
status 显示
冲突(落后 N 提交),其中 N 是local_head到根 commit 的父链总长度(非local_head..remote_head的实际距离)。期望结果
当
local_head领先于remote_head时,behind_count应为 0,status 应为AheadOfParent(待推送)。根因
git.rs中scan_single_submodule第 396-407 行:gix_count_between(from, to)只单向从to往 parent 回溯,直到遇到from。但如果local_head是remote_head的后代(即本地领先),回溯永远不会遇到local_head,会一直走到根 commit 才停下,导致behind被错误地设置为整个历史长度。修复建议
在
scan_single_submodule中计算behind前先判断local_head是否为remote_head的祖先(用gix_count_between(local_head, remote_head)能否到达local_head),若不是则behind = 0。is_orphaned的判断也需考虑这种情况。