简体中文 | English
insight-git 是一个用来批量管理和分析多个 Git 仓库的命令行工具。
如果你的机器上散落着几十上百个仓库,平时要操心「哪些忘了提交、哪些忘了推送、哪个分支落后了远端、今天写了多少代码、哪些仓库在依赖某个模块」——这些跨仓库的琐事,insight-git 用一条命令帮你扫完。它还顺带集成了 GitLab / Gitea 平台操作、Go 项目结构分析、代码阅读追踪等能力。
- 一屏总览 ——
status把未提交、未推送、落后远端汇成一屏,一条命令看完所有仓库的健康,不用分别跑 commit / push / behind。 - 全盘普查 ——
census把整次扫描收敛成几个计数:多少仓库已废弃、多少只存在于这块盘上、多少揣着从未推送的提交、近两年的提交里 AI 署名占多大比例。status是每个仓库一行,census是全盘一份报告。 - 多仓库巡检 —— 一次性扫描配置目录下的所有仓库,找出忘记提交、忘记推送、落后远端的仓库。
- 分支落后检测 ——
check behind精确判断每个本地分支相对其上游远端分支的状态(领先 / 落后 / 分叉 / 无上游 / 已删除 …),支持批量并发。 - 未提交行数统计 ——
check dirty-lines报告当前仓库相对 HEAD 有多少行未提交(暂存+未暂存)。 - 路径历史 ——
history告诉你某个文件/目录第一次被提交和最后一次被修改分别是哪个 commit、什么时间;文件默认跨重命名追溯。 - Git 身份管理与泄露审计 ——
user在配置里预定义若干身份,一条命令给某个仓库设定专属user.name/user.email;user audit更进一步,零配置扫描历史,揪出「拿公司邮箱提交了开源仓库」这类身份跑错仓库的情况。 - 代码量统计 —— 按天、按区间统计所有仓库的增删行数,支持表格 / 终端 UI / 网页三种展示。
- Git 快捷操作 ——
ac/acp一步完成 add+commit(+push),外加目录树、remote 列表等便捷视图。 - 代码阅读追踪 —— 记录某个仓库里哪些源码文件已经读过、还剩哪些没读。
- Go 项目分析 —— 输出 Go 项目结构统计,或反查「哪些仓库依赖了某个 module / package」。
- 仓库索引 —— 把目录树里所有 Git 仓库的元信息采集进 SQLite,便于后续查询排序。
- 平台集成 —— GitLab / Gitea 的项目、镜像、远程管理,以及 GitLab → 本地的批量同步。
运行时只需 Git ≥ 2.13.0(check behind 依赖 git for-each-ref 的 upstream:track 特性)。go install 与源码构建另需 Go 1.25+。
方式一:go install(有 Go 环境,最省事)
go install github.com/xunull/insight-git@latest装到 $GOPATH/bin,二进制名 insight-git,版本号从模块信息自动带出。
方式二:下载预编译二进制(无需 Go)
到 Releases 下载对应平台的压缩包(linux / macOS × amd64 / arm64),解压后把 insight-git 放进 PATH。
方式三:从源码构建
git clone https://github.com/xunull/insight-git.git
cd insight-git
make build # 构建到 ./bin/insight-git(带版本号信息)
make install # 或安装到 $GOPATH/bin装好后先跑 insight-git config init 生成起步配置(见配置文件)。
# 1. 在家目录放一份配置(见下一节)
vim ~/.insight-git.yaml
# 2. 看看哪些仓库忘了提交 / 推送
insight-git check commit
insight-git check push
# 3. 检查所有仓库当前分支有没有落后远端
insight-git check behind
# 4. 只看当前目录这一个仓库的全部分支落后情况
insight-git check behind .
# 5. 统计今天写了多少代码
insight-git today
# 6. 看看某个文件是什么时候进仓库的、最后一次改是什么时候
insight-git history pkg/git_client/open.go
# 7. 给公司项目单独设一个 git 身份;并扫描历史,看有没有身份跑错了仓库
insight-git user set work
insight-git user check # 配置视图:各仓库配置成谁提交
insight-git user audit # 历史视图:谁实际提交过(零配置可跑)不带子命令直接运行
insight-git会打印帮助。任意命令加-h查看该命令的完整选项。
默认从 $HOME/.insight-git.yaml 读取,也可以用 --config <path> 指定。字段名大小写不敏感。
第一次使用可以跑
insight-git config init生成一份带注释的起步配置(所有仓库根默认注释掉,取消注释并改成你的真实路径即可);insight-git config path打印当前生效的配置路径。
# 存放 Git 仓库的根目录(可多个)——多仓库巡检的扫描范围
gitHome:
- /path/to/your/repos
- /path/to/another/workspace
# GitHub 仓库根目录——github-backup 系列命令使用
gitHubHome:
- /path/to/github/repos
# 命名的仓库根目录映射,配合全局参数 --root 使用
repoRootMap:
others: /path/to/other/repos
# 扫描目录深度(默认 2)
depth: 2
# 预定义的 git 身份,供 user set 使用。alias 唯一,是你实际敲的名字;
# name / email 一一对应 git 的 user.name / user.email
gitUsers:
- alias: oss
name: your-name
email: you@personal.com
- alias: work
name: your-work-name
email: you@company.com
signingKey: "" # 可选,对应 user.signingkey
# 身份审计(user check / user audit)的扫描根,与 gitHome 解耦——
# 身份最容易出错的往往正是日常巡检不覆盖的那些目录
userScanHome:
- /path/to/work/repos
- /path/to/other/repos
# 备份 remote 的基址(backup / github-backup 使用)
BackupRemote: http://backup.example.com/backup
# 可配置多个 GitLab 实例,用 name 区分;不指定 name 时默认取第一个
gitlab:
- name: my-gitlab
host: https://gitlab.example.com
token: <your-gitlab-token>
user: <your-user>
# Gitea 实例配置(⚠️ 当前 gitea 相关代码可能不可用,后续版本会更新)
gitea:
token: <your-gitea-token>
host: http://gitea.example.com
apiHost: http://gitea.example.com/api/v1
githubBackupOrg: github-backup
proxy: http://127.0.0.1:1080
# readthis 命令默认使用的 remote 名(对应某个 gitlab.name)
read_this_remote: my-gitlab
⚠️ 配置里的 token 是敏感信息,请勿提交到仓库。
以下参数对所有命令生效:
| 参数 | 说明 |
|---|---|
--config <path> |
指定配置文件(默认 $HOME/.insight-git.yaml) |
--repo <name> |
目标仓库模式:按名字在配置目录里定位某个仓库 |
--root <dir> |
配合 --repo,限定在某个根目录下查找 |
--depth <n> |
目录扫描深度(默认 2) |
-v, --verbose |
详细输出 |
--debug |
调试输出 |
配置里有几个「我的仓库/资源在哪」的字段,各由不同命令使用。不确定该把路径填进哪个时,对照这张表:
| 配置字段 | 谁在用 | 说明 |
|---|---|---|
gitHome |
status、check commit/push/behind/utd、today、stat、show active |
主扫描范围——绝大多数批量命令都扫这里 |
githubHome |
check github-backup |
GitHub 仓库根,只给备份检查用 |
userScanHome |
user check / user audit |
身份审计的扫描根,与 gitHome 解耦(身份最易出错的目录往往不在日常巡检范围) |
repoRootMap |
全局 --root 配合 --repo <name> |
命名根,用于按名字定位单个仓库 |
gitlab[] / gitea |
gitlab、gitea 平台命令 |
远端平台的 API 配置,不是本地扫描根; |
简单说:日常「哪些仓库忘了提交/推送/落后」填 gitHome;公司/客户项目的身份审计填 userScanHome。
在 gitHome 配置的所有目录下扫描仓库,逐个检查状态。
| 命令 | 作用 |
|---|---|
insight-git show active |
列出近 90 天内有过提交的仓库 |
insight-git today |
统计今天所有仓库的增删行数(汇总表格) |
insight-git check commit |
列出有未提交改动的仓库 |
insight-git check push |
列出有已提交但未推送提交的仓库 |
insight-git check utd [--all] |
fetch 后对比,列出与远端不一致的仓库(--all 检查所有 remote) |
insight-git check behind [.] |
分支落后检测,详见下一节 |
insight-git check dirty-lines |
当前仓库未提交的行数统计,详见后文 |
insight-git check github-backup [--add] [--auto] |
检查 gitHubHome 里的仓库是否配置了备份 remote;--add 交互式补齐,--auto 免确认 |
history是针对单个路径的历史查询,不属于批量巡检,见路径历史history。
把「未提交 / 未推送 / 落后远端」汇成一屏——原本要跑 check commit + check push + check behind 三条命令才看得全,现在一条搞定。
# 扫描 gitHome 下所有仓库,只列出有问题的
insight-git status
# 只看当前目录这一个仓库
insight-git status .
# 连干净的仓库也列出来
insight-git status --all
# 先 fetch 再判断(落后计数更准,但更慢)
insight-git status --fetch输出示例(每个有问题的仓库一行,干净的折叠成计数):
~/repos/proj-a ✎ 3 files ↑2
~/repos/proj-b ↓5 behind
~/repos/proj-c ↕ diverged (↑1 ↓2)
42 repos, 39 clean
标记含义:✎ N files 有未提交改动;↑N 领先上游 N 个未推送提交;↓N behind 落后;↕ diverged 分叉;另有 no upstream / detached HEAD / unborn branch / upstream gone。颜色:黄=未提交,青=未推送,红=落后/分叉。
默认离线(读现有 tracking ref,快;落后计数可能是旧的),--fetch 先刷新。无参数扫 gitHome,. 只看当前仓库,--all 连干净仓库一并列出。
status 每个仓库一行,回答「这个仓库要不要处理」。census 全盘一份报告,回答「我这块盘整体是什么状况」——多少仓库已经废弃、多少只存在于这一份、多少揣着从未推送的提交、近两年的提交里 AI 署名占多大比例。
# 扫 gitHome 下所有仓库,出一份报告
insight-git census
# 扫指定目录
insight-git census ~/repos输出示例:
Scanning: ~/repos (depth 2) · 81 repos
untouched >1y 25 30%
untouched >2y 20 24%
only 1 remote 80 98%
no remote at all 1 1%
unpushed commits 15 18%
dirty worktree 13 16%
AI-attributed 737 42% of 1728 commits since 2024-07
81 repos · 1 exist only on this disk
no remote at all 标红,因为它是唯一一行代表真的会丢:那些仓库不存在于任何其它地方。其余各行是观察,不是警报。
数字难看的那一行,用 --list 还原成具体仓库:
insight-git census --list no-remote # 只存在于这块盘上的是哪几个
insight-git census --list unpushed # 哪些仓库揣着没推的活儿
insight-git census --list ai # 按 AI 占比从高到低排~/repos/zdai 53/54 98%
~/repos/aifd 31/32 96%
~/repos/laipeini 13/14 92%
| signal | 含义 | 默认排序 |
|---|---|---|
stale |
一年没有提交 | 最老优先 |
stale2y |
两年没有提交 | 最老优先 |
one-remote |
只有一个 remote,没有备份 | 最老优先 |
no-remote |
一个 remote 都没有 | 最老优先 |
unpushed |
有本地提交不在任何 remote 上 | 数量多的优先 |
dirty |
工作区有未提交改动(不含 untracked) | 数量多的优先 |
ai |
窗口内有 AI 署名的提交 | 比例高的优先 |
| 参数 | 说明 |
|---|---|
--list <signal> |
列出某个 signal 背后的仓库;signal 打错会直接报错退出,不会白扫一遍 |
--sort age|count|ratio |
覆盖默认排序 |
--since-months <n> |
AI 归因窗口,默认 24 个月 |
--concurrency <n> |
并发扫描数,0 = 16 |
两处语义值得说明:
- 未推送用「所有本地分支对所有 remote」判定,而不是「当前分支对它的 upstream」。一个 checkout 在
main、活儿却在没推的 feature 分支上的仓库,后者看不见。完全没有 remote 的仓库,整段历史都算未推送——那是字面意义上的事实。 - AI 归因读 commit 作者邮箱和
Co-authored-by尾注。默认只统计近 24 个月,因为跨全部历史会被 agent 尚不存在的年份稀释。尾注的匹配范围比作者邮箱宽,因为一个名叫 Claude 的人不该被算成 AI。需要 git 2.29+ 读尾注;更老的 git 会退化成只按作者邮箱统计,不会报错。
扫描根的优先级:命令行参数 > 配置文件的 gitHome > 当前目录,所以没有配置也能直接用。--depth 默认 2,每加一层会显著变慢(会走进 node_modules 这类目录)。
scripts/git-census.sh 是同一份报告的纯 shell 版本,不需要安装本工具,可以直接粘贴给别人跑。
逐个本地分支,判断它相对其配置的上游远端分支处于什么状态。默认先 fetch 再判断(准确优先),只看当前分支。
# 扫描 gitHome 下所有仓库的当前分支
insight-git check behind
# 只看当前目录的仓库,且展示全部分支
insight-git check behind .
# 看所有仓库的所有本地分支
insight-git check behind --all
# 跳过 fetch,直接用现有的 tracking ref 比较(快,但可能是旧数据)
insight-git check behind --offline
# 脚本友好:只要有任何分支落后或分叉,就以非零码退出
insight-git check behind --exit-code八种状态:
| 状态 | 含义 |
|---|---|
up-to-date |
与上游完全一致 |
behind N |
落后上游 N 个提交 |
ahead N |
领先上游 N 个提交 |
diverged |
与上游分叉(既有领先又有落后) |
no-upstream |
该分支没有配置上游 |
gone |
配置了上游,但上游 ref 已经不存在(远端被删) |
detached |
HEAD 处于游离状态(仅当前分支路径) |
unborn |
HEAD 指向一个还没有任何提交的分支 |
输出带颜色区分:绿色=最新,黄色=落后,青色=领先,红色=分叉/已删除,灰色=无上游/游离/未初始化。
选项:
| 选项 | 说明 |
|---|---|
--all |
检查所有本地分支,而不只是当前分支 |
--offline |
跳过 fetch,用现有 tracking ref 比较 |
--prune |
fetch 时顺带 prune,让 gone 判断更准确(会改动本地 ref) |
--exit-code |
git 风格:有分支落后或分叉时以退出码 1 结束 |
--concurrency <n> |
批量模式下的最大并发仓库数(0 = 默认 16) |
报告当前目录所在仓库相对 HEAD 有多少行还没提交(暂存 + 未暂存一起算),等价于 git diff --shortstat 的汇总。
insight-git check dirty-lines
# 3 files changed, 128 insertions(+), 12 deletions(-)未跟踪文件不计入(git diff 本就不含它们);仓库若还没有任何提交,则统计已暂存的内容。该命令只针对当前仓库,不做批量扫描。
回答:这个文件/目录是什么时候第一次被提交的、最后一次被修改是什么时候。
# 单个文件
insight-git history pkg/git_client/open.go
# 一次查多个,文件和目录混着来
insight-git history pkg/git_client/open.go pkg/gitlab_api cmd/root.go输出示例:
pkg/git_client/open.go (followed 2 renames)
first a2aebdc 2024-07-08 20:40 xunull update-20240708_204053
last cd8db3c 2024-10-05 20:50 xunull update-20241005_205028
span 89 days
几处语义需要留意:
last指最后一次「修改」它的 commit,不是「最后一个包含它的 commit」——后者对任何还存在的文件永远等于 HEAD,没有信息量。对已删除的路径,last就是删掉它的那次提交。- 文件默认跨重命名追溯。上例里
open.go搬过两次家,默认给出内容真正诞生的 2024-07-08;若只想知道「当前这个路径何时出现」,加--no-follow(会得到 2024-10-05)。 - 目录不跟随重命名,这是 git 的限制(
--follow只支持单个文件),输出会标注(directory; renames not followed)。对目录显式传--follow会直接报错,而不是像原生 git 那样静默给出无意义结果。详见 ADR-0001。 - 时间取 author date,不是 committer date——rebase / cherry-pick 会改写后者。
- 仓库从路径自身向上定位,所以绝对路径指向另一个仓库也能查。
选项:
| 选项 | 说明 |
|---|---|
--no-follow |
不跟随重命名,报告当前路径第一次出现的时间 |
--follow |
显式要求跟随(文件的默认行为);打在目录上会报错 |
--all |
搜索所有 ref,而不只是 HEAD 可达的历史 |
退出码:0 全部找到;1 有路径在历史中不存在;2 有路径无法读取(不在 git 仓库内、对目录用了 --follow 等)。
大部分仓库用全局的 user.name / user.email 就够了,但公司项目、客户项目往往需要单独的身份。在配置文件的 gitUsers 里预定义好身份,然后一条命令套用。
insight-git user list # 列出配置里定义的所有身份
insight-git user show # 当前仓库在用谁提交,并标明来自 local 还是 global
insight-git user set work # 给当前仓库写入 work 这个身份(--local)
insight-git user check # 配置视图:扫描根下各仓库分别配置成谁提交
insight-git user audit # 历史视图:扫历史,揪出跑错仓库的身份(零配置)user set 的输出:
proj-b
user.name oldme -> zhangsan
user.email old@qq.com -> zhangsan@acme.com
⚠ 5 commit(s) in this repo already use old@qq.com
the new identity applies to future commits only; history is unchanged
它只写 --local(即 .git/config),不碰全局配置。已有的 local 身份会被直接覆盖,改动逐行打印所以一眼可见。最后那段警告命中的是这个功能真正的痛点——你往往是提交完才发现身份用错了。
user check 的输出:
work zhangsan <zhangsan@acme.com> [local] 4 repos
work/acme/api-service
work/acme/web-portal
xunull <xunull@163.com> [global] 134 repos
⚠ unregistered identity oldme <old@qq.com> [local] 1 repos
work/legacy/crm
140 repos scanned, 1 using an unregistered identity
按身份分组,大群体只给一行数字,少数派逐个列出(--verbose 可展开全部)。只有「自己设了 local 身份、但那个邮箱不在 gitUsers 里」才会被标红——单纯继承全局身份的仓库不算异常,否则你绝大多数仓库都会变成警告。
user audit——扫描历史,揪出跑错仓库的身份:
check 看的是仓库配置成谁提交(影响未来的提交);audit 看的是历史里实际是谁提交的。它回答那个更尴尬的问题——「我是不是拿公司邮箱提交了开源仓库?」——而且零配置就能跑:
cd ~/projects && insight-git user audit # 无需任何配置,回退扫当前目录
insight-git user audit ~/work # 指定路径
insight-git user audit # 配了 userScanHome/gitHome 就扫它们它对每个仓库读历史作者(取 author、不是 committer),标出三种「值得看」的信号:
- drift —— 仓库显式设了 local 身份,但历史里从没用它提交过(通常是你改了 config、却没改历史)。只认 local:单纯继承全局身份的仓库(比如 clone 来没提交过的)不算。
- mixing —— 一个仓库历史里出现了你两个身份。owned identity(「你」)= 在 ≥2 个扫描仓库当过作者的邮箱,只出现一次的视为路过的协作者、排除,所以团队仓库不会因人多而误报。
- foreign —— 配置了
gitUsers时,历史作者里出现任何已声明身份都不认识的邮箱(陌生人,或你不再声明的旧邮箱);没配gitUsers则不触发。
输出证据优先、只摆事实不下判决,干净仓库折叠成计数:
Scanning: ~/projects (depth 2)
Owned identities: me@personal.com, me@work.com
⚠ mixing oss/some-lib
configured: Me <me@personal.com>
authored: Me <me@personal.com> 118
Me <me@work.com> 4 ← also yours
⚠ drift oss/another
configured: Me <me@personal.com>
authored: Me <me@work.com> 52
(configured identity never authored here)
42 scanned · 2 notable · 40 clean
检测模型与取舍(为何 drift 只认 local、owned 为何用跨仓库频次)见 ADR-0003。
选项(user audit):
| 选项 | 说明 |
|---|---|
--exit-code |
有 notable 仓库时以退出码 1 结束(给 CI) |
--concurrency <n> |
最大并发扫描仓库数(0 = 默认 16) |
几点说明:
- 身份只含 git 的
user.*命名空间:name、email、可选signingkey。按仓库切 SSH 私钥(core.sshCommand)、切代理等不在范围内——那是配置管理,不是身份。理由见 ADR-0002;这类需求用 git 原生的includeIf "gitdir:…"更合适,两者可以并用。 - 切换到没有
signingKey的身份时,会主动清掉仓库里残留的user.signingkey,免得旧密钥继续给新身份签名。 - 配置里
alias重复会在加载时直接报错,而不是悄悄取第一个。 set与show默认作用于当前目录,也接受全局参数--repo <name>指定仓库。- 审计的扫描根用
userScanHome,与gitHome解耦:身份最容易出错的往往正是日常巡检不覆盖的那些目录。也可以直接传路径:insight-git user check ~/some/dir。
选项(user check):
| 选项 | 说明 |
|---|---|
--exit-code |
有仓库使用未登记身份时以退出码 1 结束 |
--verbose |
列出每一个仓库,包括大分组 |
--concurrency <n> |
最大并发扫描仓库数(0 = 默认 16) |
统计 gitHome 下所有仓库的代码增删行数。日期格式为 YYYYMMDD。
| 命令 | 作用 |
|---|---|
insight-git stat <day1> <day2> |
统计两个日期之间的总增删行数 |
insight-git stat daily <day1> <day2> |
逐日统计,支持 --table / --ui / --web 三种展示 |
公共选项:--ext <后缀> 按文件后缀过滤,--ext-type <front|end> 按前/后端类别过滤。
作用于当前目录的仓库。
| 命令 | 作用 |
|---|---|
insight-git ac [message] |
git add . + git commit(等价于 git ac) |
insight-git acp [message] |
git add . + git commit + git push(等价于 git acp) |
insight-git tree [--depth n] [--v1] [--out-type ...] |
展示当前仓库的目录树 |
insight-git ls remote |
列出当前目录范围内(含当前目录及直接子目录)各仓库的 remote |
记录一个仓库里哪些源码文件已经读过。
| 命令 | 作用 |
|---|---|
insight-git readcode stat |
展示已读/未读文件统计 |
insight-git readcode unread |
列出还没标记为已读的文件 |
insight-git readthis [--remote name] |
把当前仓库标记为「已读」(向指定 remote 推送引用) |
readcode 公共选项:--ext <后缀>、--lang <语言>、--exclude-dir <目录>(可多次)。
insight-git readcode stat --lang Golang
insight-git readcode unread --lang Golang| 命令 | 作用 |
|---|---|
insight-git golang stru [dirs...] |
输出指定目录的 Go 项目结构统计 |
insight-git golang find mod <module> |
反查哪些仓库依赖了某个 Go module |
insight-git golang find pkg <package> |
反查哪些仓库 import 了某个 Go package |
把目录树里所有 Git 仓库的元信息采集进 SQLite,便于后续查询和排序。默认数据库路径 ~/.xunull-local/insight-git/data.db。
| 命令 | 作用 |
|---|---|
insight-git index repo [起始路径] |
扫描目录树,索引所有 Git 仓库(不传路径默认当前目录) |
insight-git index filter [--path 前缀] [--sort 列] |
查询已索引的仓库,支持路径前缀过滤和排序 |
index repo 选项:--db、--max-depth、--pool-size、--scan-pool-size、--dir-threshold、--exclude(可多次)。
| 命令 | 作用 |
|---|---|
insight-git remote add [gitlab-name] |
为当前仓库自动配置 GitLab remote(不传名字时用唯一的 gitlab 配置) |
insight-git backup push |
把所有仓库推送到各自配置的备份 remote |
insight-git sync --src-type gitlab --dst-type local --src-name <名> --dst-name <本地路径> |
把 GitLab 上的仓库批量克隆(裸仓库)同步到本地 |
| 命令 | 作用 |
|---|---|
insight-git git_hook pre-commit --check-large |
作为 git pre-commit hook 调用,检测过大的文件 |
insight-git version |
打印版本号与构建时的 commit hash |
以下命令目前是占位/实验状态,尚未完整实现:
stat month、backup add、gitlab mirror add。gitea 相关功能(除 GitHub→Gitea 备份外)当前可能不可用,后续会更新。
不同 Git 平台的命名空间层级不同,insight-git 在路径解析时按这个约定处理:
- GitHub —— 两层结构(
owner/repo) - Gitea —— 两层结构(
owner/repo) - GitLab —— 多层结构(
group/subgroup/.../repo)
# 构建到 ./bin/
make build
# 安装到 $GOPATH/bin
make install
# 运行测试
go test ./...
go vet ./...项目采用标准的 cobra CLI 结构:
cmd/—— 所有 CLI 命令定义pkg/insightx/—— 多仓库巡检、统计、扫描的核心逻辑pkg/git_status/—— 仓库当前状态内核(check behind、check dirty-lines、status总览)pkg/git_history/—— 路径历史内核(history)pkg/git_user/—— git 身份管理与审计内核(user)pkg/git_client/—— 基于 go-git 的仓库访问层pkg/gitlab_api/pkg/gitlab_assist/—— 平台 API 与业务封装pkg/provider/—— 面向多服务商的统一接口抽象git_repo_index/—— 仓库索引(SQLite)internal/—— 配置与全局状态
欢迎贡献。构建、测试、代码风格与 PR 约定见 CONTRIBUTING.md。
本项目基于 Apache License 2.0 开源。