package git import ( "bytes" "context" ) // ListTrackedFiles 返回 dir 仓库中被 git 跟踪的文件(git ls-files -z), // 路径相对 worktree 根,NUL 分隔以正确处理含空格/特殊字符的文件名。 // 仅跟踪文件 —— 忽略 .gitignore / 未跟踪 / vendored,避免索引器遍历海量无关文件。 func (r *DefaultRunner) ListTrackedFiles(ctx context.Context, dir string) ([]string, error) { ctx, cancel := withCtx(ctx, r.cfg.OpsTimeout) defer cancel() out, _, err := r.exec(ctx, dir, nil, "ls-files", "-z") if err != nil { return nil, err } return parseNULList(out), nil } // parseNULList 解析 NUL 分隔的文件列表(git ls-files -z)。空输入返回 nil。 func parseNULList(buf []byte) []string { if len(buf) == 0 { return nil } var out []string for _, rec := range bytes.Split(buf, []byte{0}) { if len(rec) == 0 { continue } out = append(out, string(rec)) } return out }