ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

graphify 钩子机制实战:Git post-commit 自动重建知识图谱与 CLAUDE.md 常驻集成

graphify 钩子机制实战:Git post-commit 自动重建知识图谱与 CLAUDE.md 常驻集成 graphify 钩子机制实战Git post-commit 自动重建知识图谱与 CLAUDE.md 常驻集成【免费下载链接】graphifyTurn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.项目地址: https://gitcode.com/GitHub_Trending/graph/graphifygraphify 把代码库、文档、SQL schema 等资产解析为可查询的知识图谱后还有一个关键问题图谱如何随代码持续更新而不需要人工干预。本文基于 graphify/skills/kilo/references/hooks.md 参考文档并结合 graphify/hooks.py、graphify/install.py 的源码实现完整讲解 graphify 提供的两条自动化通道Git 提交钩子commit 后自动重建图谱与 Claude Code 的 CLAUDE.md 原生集成让 Agent 每次会话都主动查图、改码后重建。读完后你可以直接在任意 Git 项目中启用钩子、配置跳过与超时参数并理解钩子脚本内部从解释器探测到后台分离重建的每一环实现。两条自动化通道概览参考文档将集成方式分为两类二者解决不同场景下的图谱保鲜问题通道解决的问题触发时机需要常驻进程Git commit 钩子图谱随提交自动重建每次git commit后否一次性触发CLAUDE.md 集成Claude Code 会话常驻感知图谱每次打开 Claude Code 会话否由 Agent 遵循指令两条通道都完全基于本地确定性 AST 解析不依赖向量库或 LLM API这也是 graphify 的核心设计取向。Git commit 钩子安装、移除与状态检查基本命令参考文档给出的完整命令集如下graphify hook install # 安装 graphify hook uninstall # 移除 graphify hook status # 检查状态这三个子命令由 graphify/cli.py 分发到 graphify/hooks.py 中的install/uninstall/status三个函数。安装成功后命令会逐行报告三个对象的状态post-commit: installed at .git/hooks/post-commit post-checkout: installed at .git/hooks/post-checkout merge driver: registered (graphify-out/graph.json mergegraphify)触发行为与变更检测按参考文档钩子在每次git commit之后执行以下动作通过git diff HEAD~1检测本次提交改动了哪些文件源码中的实际实现为git diff --name-only HEAD~1 HEAD首个命令失败时回退到git diff --name-only HEAD见 graphify/hooks.py对变更的代码文件重新运行 AST 抽取重建graph.json与GRAPH_REPORT.md输出目录默认graphify-out/。文档特别强调一点文档/图片类变更不会被钩子处理这类变更需要手动运行/graphify --update。从源码结构看钩子把变更清单通过环境变量GRAPHIFY_CHANGED换行分隔的文件路径列表传给后台 Python 进程再由_rebuild_code(_root, changed_pathschanged, ...)做增量重建见 graphify/hooks.py 与 graphify/hooks.py。与既有钩子共存参考文档说明如果post-commit钩子已存在graphify 不会替换它而是追加。这一点由 graphify/hooks.py 的_install_hook函数保证其写入策略按情况分四种钩子文件不存在新建文件以#!/bin/sh开头并写入完整脚本chmod 0o755钩子文件存在且已含 graphify 标记原地更新 graphify 区块幂等内容未变时报告 already installed钩子文件存在但无 graphify 标记在文件末尾追加 graphify 区块卸载时若钩子只剩 shebang 行则直接删除钩子文件否则仅剥除 graphify 区块、保留其他内容graphify/hooks.py。区块边界由注释标记界定避免误删用户内容# graphify-hook-start post-commit 区块 # graphify-checkout-hook-start post-checkout 区块hook status会检测标记是否存在并额外校验.graphifyrc配置与钩子内烘焙值是否一致配置过期时会报告 installed (out of date: ...)graphify/hooks.py。对应的行为测试可参考 tests/test_hooks.py。post-commit 钩子的源码级实现前置守卫什么情况下直接退出钩子脚本在触发重建前有一系列安全阀全部写在 graphify/hooks.py 的_HOOK_SCRIPT模板中rebase / merge / cherry-pick 期间跳过检测$GIT_DIR/rebase-merge、rebase-apply、MERGE_HEAD、CHERRY_PICK_HEAD是否存在存在即退出避免未暂存变更阻塞--continueGRAPHIFY_SKIP_HOOK1手动单次禁用重建与:-0默认值写法保证环境变量优先worktree 守卫git rev-parse --git-dir与--git-common-dir都解析为绝对路径后比较不相等说明处于 linked worktreegit worktree add的附属检出直接退出。源码注释解释了原因worktree 里重建会写出用户从未要求的 delta-only 图并与部署/CI 的git clean竞争graphify/hooks.py仅产物变更时跳过若git diff结果里只有graphify-out/下的文件变更比如你把图谱产物纳入了版本控制钩子直接退出避免重建产生新产物 → 新产物再触发重建的死循环graphify/hooks.py确定性聚类export PYTHONHASHSEED0。源码注释说明 networkx 的 Louvain 社区发现遍历字符串键集合其顺序受PYTHONHASHSEED随机化影响固定后graphify-out/输出才可复现Windows/MSYS 串行化检测到WINDIR或MSYSTEM环境变量时默认GRAPHIFY_MAX_WORKERS1Git for Windows 的 MSYS 钩子可能从 GUI 客户端继承脆弱的管道句柄显式设置GRAPHIFY_MAX_WORKERS仍可覆盖。Python 解释器探测为什么钩子里有几百行 shell钩子运行时刻GUI git 客户端、CI runner的 PATH 往往不包含~/.local/bin而uv tool/pipx安装下解释器藏在隔离 venv 里。为此钩子内嵌了一段多级探测逻辑graphify/hooks.py 的_PYTHON_DETECT按优先级依次尝试__PINNED_PYTHON__安装时由_pinned_python()替换为当前sys.executable的绝对路径并烘焙进脚本git 触发时优先使用graphify-out/.graphify_pythonskill 与 CLI 写入的解释器路径文件可存活于 uv-tool 重装之后graphify启动器command -v graphify定位后按 Windows pip 布局Scripts/graphify旁边的python.exe或 POSIX shebang 解析出解释器uv tool 环境扫描遍历UV_TOOL_DIR、~/.local/share/uv/tools、%AppData%/uv/tools下每个工具的bin/python/Scripts/python.exe兜底PATH 上的python3/python全部失败则向 stderr 打印提示并以 0 退出绝不阻塞提交。每一级候选都必须通过importlib.util.find_spec(graphify)探针只定位包、不执行包导入避免冷启动时多次全量导入导致的卡顿且路径要经过字符白名单校验只允许文件系统路径合法字符防止 shebang 中夹带 shell 元字符被注入生成的脚本。后台分离重建commit 永不阻塞全库重建在大仓库上可能耗时很长如果 post-commit 钩子同步执行shell 会被整个重建过程卡住。graphify 的解法graphify/hooks.py 的_LAUNCHER_TEMPLATE与_detached_launch是钩子用一行 shell 启动一个极小的 Python 外壳进程该外壳进程再以完全分离的方式POSIX 用start_new_sessionTrueWindows 用CREATE_NO_WINDOW | CREATE_NEW_PROCESS_GROUP拉起真正的重建子进程并立即返回。注释中记录了这段设计的历史动因早期用nohup ... 后台化但 Git for Windows 自带的 MSYS shell 没有nohup/setsid重建静默失败且git commit仍返回 0图谱无声地过期改由 Python 负责分离后跨平台一致。重建子进程的行为要点graphify/hooks.py 的_REBUILD_BODY_COMMIT从GRAPHIFY_CHANGED读取变更文件清单为空直接退出调用_apply_resource_limits()限制资源并按GRAPHIFY_REBUILD_TIMEOUT默认 600 秒设置超时POSIX 用SIGALRM无该信号的平台退化为守护线程看门狗超时打印错误并退出码 1GRAPHIFY_FORCE1/true/yes时强制全量重建忽略增量输出目录取GRAPHIFY_OUT默认graphify-out若存在out/.graphify_root则以其中的仓库根为准调用_rebuild_code(_root, changed_pathschanged, force_force)完成增量重建重建成功后若out/memory/目录里存在问答记录best-effort 调用graphify.reflect刷新reflections/LESSONS.md失败不影响钩子退出码。子进程的 stdout/stderr 追加写入$GRAPHIFY_REBUILD_LOG未设置时为~/.cache/graphify-rebuild.loggraphify/hooks.py。钩子触发时终端只会打印一行[graphify hook] launching background rebuild (log: /home/you/.cache/graphify-rebuild.log)重建完成前你可以继续其他工作之后看日志确认结果即可。post-checkout 钩子切换分支时全量重建graphify hook install实际会安装两个git 钩子。post-checkout 钩子graphify/hooks.py 的_CHECKOUT_SCRIPT在切换分支时触发全量重建与 post-commit 的差异仅在BRANCH_SWITCH1第 3 个参数即真正的分支切换而非单文件 checkout时执行PREV_HEAD NEW_HEAD的 no-op 切换如无起点git checkout -b直接退出要求graphify-out/目录已存在即图谱曾经构建过否则退出不带changed_paths调用_rebuild_code(_root, force_force)走全量路径——因为分支切换可能触碰任意文件增量重建不适用源码注释指出_rebuild_code内部的 flock 文件锁可防止 commit 与 checkout 背靠背触发时的重建堆积。它同样受GRAPHIFY_SKIP_HOOK、worktree 守卫、rebase/merge 守卫约束。附带能力merge driver 与 .graphifyrc安装钩子时会顺带注册graph.json的 union merge drivergraphify/hooks.py通过git config写入merge.graphify.name/merge.graphify.driver并在.gitattributes追加一行graphify-out/graph.json mergegraphify已存在则不重复写入绝不覆盖其他条目。解释器同样按pin 当前解释器策略烘焙保证合并时即使graphify不在 PATH 也能运行。hook uninstall会成对移除 config 键与 gitattributes 行。另外仓库根目录的.graphifyrc可配置viz_node_limit非负整数安装时会被烘焙为export GRAPHIFY_VIZ_NODE_LIMIT${GRAPHIFY_VIZ_NODE_LIMIT:-n}——:-写法保证单次GRAPHIFY_VIZ_NODE_LIMIT... git commit仍能覆盖项目默认值graphify/hooks.py、graphify/hooks.py。常用环境变量汇总变量作用默认值GRAPHIFY_SKIP_HOOK设为1跳过钩子重建0GRAPHIFY_REBUILD_TIMEOUT重建超时秒数0表示不限时600GRAPHIFY_FORCE1/true/yes强制全量重建空增量GRAPHIFY_OUT图谱输出目录graphify-outGRAPHIFY_REBUILD_LOG后台重建日志路径~/.cache/graphify-rebuild.logGRAPHIFY_MAX_WORKERS并行 worker 数Windows/MSYS 下默认强制为 1平台相关GRAPHIFY_CHANGED钩子导出的变更文件清单供重建脚本消费由钩子设置CLAUDE.md 原生集成让 Claude Code 常驻查图安装命令参考文档给出的操作是一行graphify claude install该命令在每个项目中执行一次使 graphify 在 Claude Code 会话中始终开启。之后回答代码库问题前 Claude 会先查图、代码变更后会重建图谱后续会话无需再手动敲/graphify。移除同样是对称的一条命令graphify claude uninstall # 移除该 section实际写入了什么从源码看claude_installgraphify/install.py做了两件事向本地CLAUDE.md写入## graphifysection。内容来自 graphify/always_on/claude-md.md写入时按标记精确替换或追加不影响文件中其他章节。写入的规则原文是## graphify This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships. Rules: - For codebase questions, first run graphify query question when graphify-out/graph.json exists. Use graphify path A B for relationships and graphify explain concept for focused concepts. These return a scoped subgraph, usually much smaller than GRAPH_REPORT.md or raw grep output. - If graphify-out/wiki/index.md exists, use it for broad navigation instead of raw source browsing. - Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context. - After modifying code, run graphify update . to keep the graph current (AST-only, no API cost).注册 Claude Code 的 PreToolUse 钩子向.claude/settings.json的hooks.PreToolUse数组注册 matcher 为Bash|Grep搜索与Read|Glob的钩子graphify/install.py让 Claude 在读文件/搜索前被提醒先查图谱重复安装会先清理旧条目再写入升级时可替换旧版本钩子载荷。--strict模式会额外约束每次会话首次裸读文件必须先跑一次graphify query可用GRAPHIFY_HOOK_STRICT0关闭graphify/install.py。钩子行为本身的测试覆盖见 tests/test_read_hook.py 与 tests/test_search_hook.py。卸载的清理范围claude_uninstallgraphify/install.py的清理比安装更宽覆盖用户可能把配置挪动的本地变体文件剥离CLAUDE.md、CLAUDE.local.md、.claude/CLAUDE.local.md三处文件中的## graphifysection按 H2 精确匹配绝不误伤用户手写的### graphify标题删除后文件为空则连同文件一起删除从.claude/settings.json和.claude/settings.local.json中移除 graphify 的 PreToolUse 钩子条目删除已安装的 skill 文件用户级或项目级按调用范围决定。两种机制如何配合两条通道正交、可叠加Git 钩子保证graph.json在提交后自动刷新人不介入CLAUDE.md 集成保证 Agent 会话中的查询走图谱而非全量 grep语义层介入。一个典型工作流是graphify install生成初始图谱后执行graphify hook install与graphify claude install此后 commit 触发后台增量重建日志在~/.cache/graphify-rebuild.logClaude Code 会话则按## graphify规则优先使用graphify query/graphify path/graphify explain获取子图文档与图片类变更不被钩子覆盖时手动运行/graphify --update补齐。若某次提交不希望触发重建如批量 rebase 后的清理提交临时设置GRAPHIFY_SKIP_HOOK1即可随时用graphify hook status核对 post-commit、post-checkout 与 merge driver 三项的安装状态是否最新。【免费下载链接】graphifyTurn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.项目地址: https://gitcode.com/GitHub_Trending/graph/graphify创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表