背景
要做技术项目相关的AI智能助手,但目前AI物料只能由知识库服务提供,如果存放在其他地方则无法进行训练。加上很多技术文档都在git里,为了方便迁移我们需要自动化,自动将git项目中的readme同步至知识库中便于AI训练。
于是分两步实现:
- 读取git中的readme实时同步到知识库;
- 调用知识库存储接口,将其存到知识库中;
本文主要是记录下第一步即如何读取git中的readme
目前选用webhook方式来实现,在push master分支时判断readme是否被修改,有修改就拉取readme。
步骤一:配置webhook
首先给git项目添加webhook,填写本地服务接口(注意!回调是post接口)、触发来源选择“推送事件”。

敲黑板!! 因为git服务器不在你本地所以它是无法访问到你本地服务的8001端口的!!!
这里我们需要个工具,将本地服务转发到外网,本次使用的是ngrok
注册并登录后,ngrok站点会告诉你如何使用

如果没装
brew也可以选择右边Download。装好后执行下面的(8001是服务端口号),我本地服务起的8001端口所以:
ngrok http http://localhost:8001
执行之后

可以看到现在外网访问https://5f9ee832ccb7.ngrok-free.app 指向的就是我本地 http://localhost:8001。
修改下刚才的配置

注意:每次重新启动ngrok,域名都会变,记得及时更改。
现在我们修改一下master上的任意文件并push或者点一下webhook里的测试按钮,选择刚才设置的推送事件

绿色部分是之前测试的记录,View details 可以查看返回,目前我们已经拿到git返回的数据了接下来进行处理。
步骤二:筛选数据
当push的分支是master且readme有修改的时候进行同步,需要在我们代码里添加这部分逻辑。
git回调传递的消息如下
{
"object_kind": "push",
"event_name": "push",
"before": "ce0de62106188e6cf911ea23789193a23f4df93a",
"after": "004c5737095bdf0ca97d894a3d866b60e8ebd6ef",
"ref": "refs/heads/master",
"checkout_sha": "004c5737095bdf0ca97d894a3d866b60e8ebd6ef",
"message": null,
"user_id": 14290,
"user_name": "用户名",
"user_username": "git用户",
"user_email": "git用户邮箱",
"user_avatar": "git用户头像",
"project_id": 52251,
"project": {
"id": 52251,
"name": "项目名",
"description": null,
"web_url": "项目链接",
"avatar_url": null,
"git_ssh_url": "git@igit.58corp.com项目.git",
"git_http_url": "https://igit.58corp.com项目git",
"namespace": "项目组",
"visibility_level": 0,
"path_with_namespace": "项目组/路径",
"default_branch": "master",
"ci_config_path": "",
"homepage": "项目首页",
"url": "url",
"ssh_url": "ssh_url",
"http_url": "http_url"
},
"commits": [
{
"id": "004c5737095bdf0ca97d894a3d866b60e8ebd6ef",
"message": "Update readme.md",
"title": "Update readme.md",
"timestamp": "2025-08-11T08:19:57+00:00",
"url": "https://igit.58corp.com项目/-/commit/004c5737095bdf0ca97d894a3d866b60e8ebd6ef",
"author": {
"name": "用户名",
"email": "用户邮箱"
},
"added": [
],
"modified": [
"readme.md"
],
"removed": [
]
}
],
"total_commits_count": 1,
"push_options": {
},
"repository": {
"name": "ele-demo",
"url": "url",
"description": null,
"homepage": "homepage",
"git_http_url": "git_http_url",
"git_ssh_url": "git_ssh_url",
"visibility_level": 0
}
}
我们可以根据ref来判断是否为master分支,commit里的added和modified来判断readme是否被修改
@Post('/branchChange')
async branchChange(@Req() req, @Res() res) {
const {ref, project_id, commits} = req.body;
// master分支
const isMaster = ref === 'refs/heads/master';
// readme文件有修改
let changeReadmeName = '';
for (let commit of commits) {
if(changeReadmeName){break}
const curCommit = Array.from(new Set([...commit.added,...commit.modified]))
changeReadmeName = curCommit.find(item => item.toLowerCase() === 'readme.md')
}
if (isMaster && changeReadmeName) {
// 这里isMaster为是否是master分支 changeReadmeName是修改的readme的文件名
...
}
}
步骤三:申请令牌
读取git文件需要权限,本次需求需要读取多个项目所以适合使用配置个人令牌。
git--用户设置--访问令牌,选择好权限之后创建


创建完成
步骤四:读取readme
这一步就简单了,调用git接口
// 读取readme.md内容
const fileUrl = `https://igit.58corp.com/api/v4/projects/${project_id}/repository/files/${changeReadmeName}/raw?ref=master`
const tmp = await axios.get(fileUrl, {
headers: { 'PRIVATE-TOKEN': “你的令牌!!!”}
})
// 这里的tmp.data就是readme里的文本啦
res.send({
code: 200,
data:tmp.data
})
步骤五:调用接口存储到知识库中
拿到 tmp.data 之后请求接口进行存储即可,不再赘述。
等你的接口上线后记得在webhook里把url域名改回去~
已上