Git结构化分析工具

git-prism是一款为LLM代理优化的Git数据分析工具,提供结构化JSON输出以替代传统的人类可读差异显示,支持函数级粒度分析、导入跟踪、依赖变更、完整文件快照等功能。

  • by mikelane
  • Rust
  • 本地部署
  • 5 星标
  • 更新于
在 GitHub 查看 mikelane/git-prism

使用说明

git棱镜

为LLM代理优化了git数据。五种替代以人为本的MCP工具 与结构化JSON的区别——函数级粒度、导入跟踪、, 依赖关系更改、完整文件快照、每次提交历史记录、函数 上下文(调用者、被调用者、测试引用)和一个调用 review_change 结合清单和功能上下文进行公关审查的编排。

问题

Git的瓷器输出(diff, log, --stat)是为人眼设计的。当 LLM代理解析统一的diff,并在其上燃烧令牌 @@ 大块头, +/- 例如文本、行前缀和没有语义意义的空白上下文。更糟糕的是 必须重建 到底发生了什么变化 --修改了哪些功能,哪些 无论文件是从原始文本生成的,都添加了导入。

git prism直接为代理提供结构化数据:每个文件的变更清单 元数据和功能级别分析,以及完整的前后文件内容 需要更深入的检查。

安装

来自crates.io(推荐)

cargo install git-prism

来源

cargo install --path .

二进制下载

从中获取预构建的二进制文件 GitHub 发布 页面。

Homebrew(macOS和Linux)

brew tap mikelane/tap
brew install git-prism

MCP注册

将git prism注册为Claude Code的MCP服务器:

claude mcp add git-prism -- git-prism serve

就是这样。服务器使用stdio传输,在所有克劳德代码中都可用 会议。

Shim与MCP服务器——你需要哪一种?

git棱镜通过两个独立的机制工作。他们做不同的事情 可以一起使用或单独使用:

路径垫片(git-prism shim install) MCP服务器(git-prism serve)
它拦截了什么 git 和 gh 代理进行的CLI调用 直接调用git prism MCP工具(get_change_manifest, get_function_context等等)
它是如何运行的 每个截获的命令一次射击;立即退出 长期运行的stdio服务器;每个Claude Code会话一个进程
需要MCP注册? 否 是(claude mcp add)

如果只使用PATH垫片 (代理人来电 git/gh 直接和你 尚未将git prism注册为MCP服务器),您不需要MCP 根本不需要注册——你可以删除它以避免成为孤儿 serve 下面描述的过程。

如果您使用MCP工具 (get_change_manifest等)在你的代理 提示,您需要注册MCP服务器。

大多数用户都想要: 垫片重新定向原始 git diff/git log 电话, 当代理显式调用MCP工具时,它们会给出结构化数据。

孤立服务流程

git-prism serve 由MCP客户端启动,其生命周期由 那个客户。在实践中,Claude Code会话有时会退出而不关闭 服务器的stdin,使孤立进程无限期运行。观察到 积累:5+个过程,从~2小时到>1天。

git prism对此进行了辩护:发球过程每次都会轮询其父pid 5秒,当检测到已重新设置为init/launchd时退出 (ppid == 1)--启动会话已终止的操作系统信号。

如果你 仅限垫片 (提示中没有MCP工具调用),删除MCP 完全注册是最简单的修复方法:

claude mcp remove git-prism

重定向挂钩(在v0.9.0中删除)

早期版本捆绑了克劳德代码 PreToolUse 重定向挂钩,通过安装 git-prism hooks install确实如此 已在v0.9.0中删除:the 路径垫片 下面是它的覆盖范围和钩子结构盲点的严格超集 使其成为两者中较弱的一个。看 ADR 0010 和 ADR 0011 理由。

git-prism hooks install 现在退出,并显示一个错误,指示您 git-prism shim install。如果你运行了旧的重定向钩子,请清理其剩余部分 PreToolUse 条目:

git-prism hooks uninstall   # removes the legacy git-prism-bash-redirect-v1 settings.json entry
git-prism hooks status      # reports whether a legacy entry remains, and at which scope

路径垫片

安装仅适用于Unix。 git-prism shim install 创建符号链接并依赖 进程级拦截;它可以在非Unix平台上干净地运行 (“非Unix平台不支持”)。直通代码路径构建和 在Windows上运行(请参见 #322)但是 安装流程本身假定macOS或Linux。

它做什么以及为什么

克劳德密码 PreToolUse 钩子只会在克劳德·科德的内部开火 PreToolUse 管道。那些掏腰包的特工 git 通过其他渠道——子流程, shell工具、构建脚本、包装器——永远不要碰它。这个盲点就是为什么 捆绑的重定向钩被移除,取而代之的是PATH垫片,它关闭了 流程层面的差距。

当安装时, git-prism 放在你的 PATH 作为一个按字面意思命名的二进制文件 git在真正的git之前。每 git 调用流程通过git prism 第一。然后,垫片根据命令决定:

  • AI代理+具有ref范围的监视列表子命令 → 前往git prism的路线 结构化JSON路径(与MCP工具返回的数据相同)而不是瓷器。 观察名单是 diff, log, show, blame,和镐形 (-S/-G)但是 仅当存在参考范围时 (例如。 git diff main..HEAD).
  • 其他一切 --人类、CI、非代理、ref范围较小的命令,如 git status 或裸露 git diff --直接落入真正的git 二进制,不变。

代理检测重用了后面的env-var逻辑 git-prism agent-detect:无代理信号(或 CI=true) 意思是香草吉特,总是。分类器和观察名单在 src/shim/classify.rs;真正的git解析器 PATH (跳过垫片自己的目录)位于 src/shim/real_git.rs.

安装

git-prism shim install

这将在以下位置创建一个符号链接 ~/.local/share/git-prism/bin/git 指向 git prism二进制文件,并打印创建的路径和要添加到您的 外壳轮廓:

Created symlink: /home/you/.local/share/git-prism/bin/git
Add this to your shell init (~/.zshrc or ~/.bashrc):
  export PATH="$HOME/.local/share/git-prism/bin:$PATH"

加上那个 export 在shell配置文件中添加行,使shim目录位于 真正的git on PATH,然后打开一个新shell。

要检查状态或拆下垫片:

git-prism shim status     # reports installed / not installed + directory
git-prism shim uninstall  # removes the symlink

已弃用: git-prism hooks install --path-shim 仍然适用于此 发布,但打印弃用警告。使用 git-prism shim install 相反。

烟雾测试

# 1. Install and wire up PATH
git-prism shim install
export PATH="$HOME/.local/share/git-prism/bin:$PATH"

# 2. As a non-agent, you get vanilla git — passthrough
git --version            # prints the real git version

# 3. As an agent, a ref-range diff is intercepted and returns structured JSON
AI_AGENT=smoke-test git diff HEAD~1..HEAD | head -c 80
# => {"metadata":{ ... structured manifest ...

# 4. A ref-range-less command always passes through, even for an agent
AI_AGENT=smoke-test git status   # plain porcelain

逃生口和环路防护

垫片组 GIT_PRISM_INSIDE_SHIM=1 在每个孩子的成长过程中,它都会孕育而生。当 shim看到变量已经设置,它强制passthrough——所以嵌套git 呼叫(a lefthook 预推钩, cargo的内部git,一个构建脚本 shell输出到git)永远不会返回到shim和循环中。你可以设置它 你自己强制vanilla git执行一个命令:

GIT_PRISM_INSIDE_SHIM=1 git diff main..HEAD   # bypasses the shim

每次调用选择退出(GIT_PRISM_PASSTHROUGH)

集 GIT_PRISM_PASSTHROUGH=1 (或别名 GIT_PRISM_DISABLE=1)使 shim执行真正的git/gh 立即 --遥测初始化之前 分类,延迟几乎为零:

GIT_PRISM_PASSTHROUGH=1 git diff main..HEAD   # real git, no shim overhead

这是放 /usr/bin 在垫片之前 PATH使用它来包裹测试套件或紧环,其中垫片处理和 遥测是不可取的:

GIT_PRISM_PASSTHROUGH=1 cargo test   # git calls inside tests skip the shim

公认的真理价值观: 1, true 不区分大小写任何其他值(或 未设置)使垫片处于活动状态。

调试

集 GIT_PRISM_DEBUG_RESOLVER=1 要将解析的实际git路径打印到stderr, 所以你可以确认 git 二进制垫片委托给:

GIT_PRISM_DEBUG_RESOLVER=1 git status
# (stderr) git-prism shim: resolved real git to /usr/bin/git

与rtk共存

如果你使用 实时动态 (或任何也包裹的工具 git 上 PATH),两个包装商将争夺同一个命令。告诉rtk离开 git 单独将其添加到rtk的排除列表中 ~/Library/Application Support/rtk/config.toml:

exclude_commands = ["git"]

卸载

git-prism hooks uninstall --path-shim   # removes the symlink
git-prism hooks status                  # reflects path-shim presence/absence

卸载后,删除 export PATH=... 您添加到shell中的行 轮廓。

垫片的端到端演示 demo/path-shim.mp4.

Agent检测

git-prism agent-detect

打印一个JSON对象,指示当前进程是否正在代表运行 仅通过环境变量检测到的AI编码代理。

{ "agent": "ClaudeCode", "signal": "ToolSpecific" }

这两个字段都是 null 当没有检测到代理时,或者当 CI=true 已设置(CI 战胜所有代理信号)。

检测优先级顺序:

  1. AI_AGENT 非空(Vercel跨工具约定,例如。 claude-code_2-1-141_agent) → signal: "AiAgent"
  2. AGENT 用分配值设置(goose, amp) → signal: "Agent".裸露 AGENT=1 被故意忽略(与ssh代理和构建系统代理冲突)。
  3. 工具特定标记: CLAUDECODE, CURSOR_AGENT, GEMINI_CLI, CODEX_SANDBOX, CLINE_ACTIVE, AUGMENT_AGENT, OPENCODE_CLIENT, TRAE_AI_SHELL_ID → signal: "ToolSpecific"
  4. CI set → {"agent": null, "signal": null} 而不管上述任何试剂标记。

此子命令是一个诊断/操作工具。它是 不 作为MCP工具公开-- 它不会出现在MCP工具注册表中,现有工具不受影响。

工具

get_change_manifest

返回关于两个git ref之间变化的结构化元数据。

参数:

参数 类型 默认值 说明
base_ref 字符串 (必填) 基本git ref(提交SHA、分支、标签, HEAD~1)
head_ref 字符串 (省略→ 工作树) 当请求中省略该字段时,该工具会进行比较 base_ref 针对工作树(阶段性+非阶段性更改),而不是区分两个提交。经过 "HEAD" 显式生成一个提交模式差异 HEAD,这与工作树模式不同。
repo_path string cwd git存储库的路径
include_patterns string[] [] 要包括的球状图案(例如。 ["*.rs", "*.go"])
exclude_patterns string[] [] 要排除的球状图案(例如。 ["*.lock"])
include_function_analysis bool的。 false 启用树保姆功能/导入分析(选择加入;默认保持响应紧凑)
cursor 字符串 null 来自先前响应的不透明分页光标
page_size int 100 每页最大文件条目数(1-500)

输出示例:

{
  "metadata": {
    "repo_path": "/home/user/myproject",
    "base_ref": "main",
    "head_ref": "HEAD",
    "base_sha": "a1b2c3d4e5f6",
    "head_sha": "f6e5d4c3b2a1",
    "generated_at": "2026-04-03T12:00:00Z",
    "version": "x.y.z"
  },
  "summary": {
    "total_files_changed": 3,
    "files_added": 1,
    "files_modified": 2,
    "files_deleted": 0,
    "files_renamed": 0,
    "total_lines_added": 47,
    "total_lines_removed": 12,
    "total_functions_changed": 4,
    "languages_affected": ["go", "rust"]
  },
  "files": [
    {
      "path": "src/handler.go",
      "old_path": null,
      "change_type": "modified",
      "change_scope": "committed",
      "language": "go",
      "is_binary": false,
      "is_generated": false,
      "lines_added": 25,
      "lines_removed": 8,
      "size_before": 1200,
      "size_after": 1450,
      "functions_changed": [
        {
          "name": "HandleRequest",
          "old_name": null,
          "change_type": "signature_changed",
          "start_line": 15,
          "end_line": 42,
          "signature": "func HandleRequest(ctx context.Context, req *Request) (*Response, error)"
        },
        {
          "name": "validateInput",
          "old_name": "checkInput",
          "change_type": "renamed",
          "start_line": 44,
          "end_line": 58,
          "signature": "func validateInput(req *Request) error"
        }
      ],
      "imports_changed": {
        "added": ["context", "errors"],
        "removed": ["log"]
      }
    }
  ],
  "dependency_changes": [
    {
      "file": "go.mod",
      "added": [{"name": "github.com/pkg/errors", "old_version": null, "new_version": "v0.9.1"}],
      "removed": [],
      "changed": []
    }
  ],
  "pagination": {
    "total_items": 3,
    "page_start": 0,
    "page_size": 100,
    "next_cursor": null
  }
}

get_file_snapshots

在两个git ref处返回文件内容之前/之后的完整值。没有要解析的差异-- 代理在每个时间点都会获得完整的文件。

参数:

参数 类型 默认值 说明
base_ref 字符串 (必填) 基本git参考
head_ref 字符串 "HEAD" 头部git ref
paths string[] (必填) 快照的文件路径(最多20个)
repo_path string cwd git存储库的路径
include_before bool的。 true 在基引用中包含文件内容
include_after bool的。 true 在head ref处包含文件内容
max_file_size_bytes int 100000 截断大于此值的文件
line_range [int,int] null 仅返回此范围内的行(1-索引)
include_diff_hunks bool的。 false 包括大块边界以进行差异相对线映射

输出示例:

{
  "metadata": {
    "repo_path": "/home/user/myproject",
    "base_ref": "main",
    "head_ref": "HEAD",
    "generated_at": "2026-04-03T12:00:00Z"
  },
  "files": [
    {
      "path": "src/handler.go",
      "language": "go",
      "is_binary": false,
      "before": {
        "content": "package main\n\nfunc HandleRequest(req *Request) error {\n    // old implementation\n}\n",
        "line_count": 5,
        "size_bytes": 82,
        "truncated": false
      },
      "after": {
        "content": "package main\n\nimport \"context\"\n\nfunc HandleRequest(ctx context.Context, req *Request) (*Response, error) {\n    // new implementation\n}\n",
        "line_count": 7,
        "size_bytes": 130,
        "truncated": false
      },
      "error": null
    }
  ],
  "token_estimate": 53
}

get_commit_history

在一个范围内的每个提交返回一个清单,以便代理可以看到在 每个提交都是单独的,而不是一个折叠的差异。

参数:

参数 类型 默认值 说明
base_ref 字符串 (必填) 基本git ref(独占-在此之后提交)
head_ref 字符串 (必填) 头部git ref(含)
repo_path string cwd git存储库的路径
cursor 字符串 null 来自先前响应的不透明分页光标
page_size int 100 每页最大提交次数(1-500)

输出示例:

{
  "commits": [
    {
      "metadata": {
        "sha": "a1b2c3d4",
        "message": "add validation helper",
        "author": "Jane Dev",
        "timestamp": "2026-04-03T10:30:00+00:00"
      },
      "files": [
        {
          "path": "src/validate.rs",
          "change_type": "added",
          "language": "rust",
          "lines_added": 25,
          "lines_removed": 0
        }
      ],
      "summary": {
        "total_files_changed": 1,
        "files_added": 1,
        "total_lines_added": 25,
        "total_lines_removed": 0
      }
    }
  ],
  "pagination": {
    "total_items": 1,
    "page_start": 0,
    "page_size": 100,
    "next_cursor": null
  }
}

get_function_context

返回每个已更改函数的调用者、被调用者和测试引用 在两个裁判之间。回答“这个函数叫什么?”和“这个函数是什么?” 功能调用?“代理人不必grep。

使用Rust、Python、Go和Types/JavaScript的导入感知作用域 将调用者扫描筛选为实际导入更改模块的文件。这 消除了叶名冲突中的误报,并提高了 大型回购。不支持的语言会退回到完整的仓库扫描。

参数:

参数 类型 默认值 说明
base_ref 字符串 (必填) 基本git参考
head_ref 字符串 (必填) 头部git ref
repo_path string cwd git存储库的路径
cursor 字符串 null 来自先前响应的不透明分页光标
page_size int 25 每页最大功能条目数(1-500)。默认值低于清单工具,因为每个条目都包含呼叫者/被呼叫者列表
function_names string[] null 限制对具有这些名称的函数的响应。使用此选项重新查询其列表在先前调用中被夹紧的函数
max_response_tokens int 8192 以估计令牌为单位的响应大小预算。当超出时,呼叫者/被呼叫者列表将按条目进行修剪。 0 禁用预算

输出示例:

{
  "metadata": {
    "base_ref": "HEAD~1",
    "head_ref": "HEAD",
    "base_sha": "a1b2c3d4",
    "head_sha": "f6e5d4c3",
    "generated_at": "2026-04-09T12:00:00Z"
  },
  "functions": [
    {
      "name": "validate_input",
      "file": "src/validation.rs",
      "change_type": "modified",
      "blast_radius": {
        "production_callers": 1,
        "test_callers": 1,
        "has_tests": true,
        "risk": "low"
      },
      "scoping_mode": "scoped",
      "callers": [
        { "file": "src/handler.rs", "line": 42, "caller": "handle_request", "is_test": false }
      ],
      "callees": [
        { "callee": "check_length", "line": 15 },
        { "callee": "check_format", "line": 18 }
      ],
      "test_references": [
        { "file": "tests/test_validation.rs", "line": 10, "caller": "test_validate_empty", "is_test": true }
      ],
      "caller_count": 2
    }
  ]
}

这 scoping_mode 字段指示如何执行呼叫者扫描: "scoped" 意味着使用了基于导入的筛选(更精确,但可能会错过以下呼叫者 使用不寻常的导入模式),同时 "fallback" 表示每 repo中的文件(权威但速度较慢)。使用此选项决定是否 零调用者结果是确定的或可能不完整的。

review_change

返回ref的组合更改清单和函数级爆炸半径 在一次通话中。使用这个 而不是 git diff <ref>..<ref> 当 审查PR、审核重构或评估合并安全性——它会给出答案 在一次工具调用中“发生了什么变化,可能会发生什么中断”,具有结构化 JSON而不是原始的diff文本。

取代常见的两步工作流程(get_change_manifest 然后 get_function_context)使用一个同时在内部运行和拆分的调用 响应大小预算40/60(manifest/function_context)。

参数:

参数 类型 默认值 说明
base_ref 字符串 (必填) 基本git参考
head_ref 字符串 (省略→ 工作树) Head git ref省略以与工作树进行比较(仅清单;函数上下文的一半返回空,因为调用者/被调用者需要提交的内容)
repo_path string cwd git存储库的路径
include_patterns string[] [] 球形图案包括
exclude_patterns string[] [] 要排除的球形图案
function_names string[] null 将函数上下文限制为这些名称的一半
max_response_tokens int 8192 合并预算;在manifest和function_context之间分割40/60。 0 禁用双方的预算
manifest_cursor 字符串 null 不透明光标仅前进清单的一半
function_context_cursor 字符串 null 不透明光标仅前进函数上下文的一半
page_size int 25 两半使用的页面大小

这两个游标是独立的,因此代理可以前进一半(例如,行走 通过一个长文件列表),而无需重新分页另一个。每个子响应 将其预算份额纳入 metadata.budget_tokens 所以下游 可观测性可以审计分裂决策。

输出示例:

{
  "manifest": {
    "metadata": {
      "base_ref": "HEAD~1",
      "head_ref": "HEAD",
      "budget_tokens": 1638,
      "...": "..."
    },
    "summary": { "total_files_changed": 3, "...": "..." },
    "files": [{ "path": "src/lib.rs", "...": "..." }],
    "pagination": { "next_cursor": null, "...": "..." }
  },
  "function_context": {
    "metadata": {
      "base_ref": "HEAD~1",
      "head_ref": "HEAD",
      "budget_tokens": 2458,
      "...": "..."
    },
    "functions": [{ "name": "validate", "blast_radius": { "risk": "medium" }, "...": "..." }],
    "pagination": { "next_cursor": null, "...": "..." }
  }
}

CLI使用情况

git prism还可以作为一个独立的CLI用于脚本编写和调试:

# Change manifest between two refs
git-prism manifest HEAD~1..HEAD

# Manifest for a specific repo path
git-prism manifest main..feature-branch --repo /path/to/repo

# Per-commit history for a range
git-prism history HEAD~5..HEAD

# Smaller pages for constrained environments
git-prism manifest main..HEAD --page-size 50

# File snapshots for specific paths
git-prism snapshot HEAD~3..HEAD --paths src/main.rs src/lib.rs

# Function context (callers, callees, test references)
git-prism context HEAD~1..HEAD

# List supported languages
git-prism languages

这 manifest, snapshot, history,以及 context 命令将JSON输出到 stdout。这 manifest 和 history 命令内部自动分页(默认 页面大小500,可配置 --page-size)并始终返回完整 结果。这 languages 命令输出纯文本。

代理工作流

一个调用路径:PR审查和重构审计

对于公关审查、重构审计或任何“发生了什么变化,什么可能会破坏”的问题, 使用 review_change 而不是 git diff:

review_change(base_ref="main", head_ref="HEAD")

这将返回一个组合 { manifest, function_context } 一次通话中的有效载荷,拆分 代币预算40/60介于两半之间。它取代了两步清单+ function_context工作流,当您在同一会话中需要两者时。

三条呼叫路径:有针对性的检查

当你需要更精细的控制时——每一半的预算不同,按函数名称过滤, 或者深入到特定文件中——按顺序使用各个工具:

第一步:与 get_change_manifest

询问清单以了解变化的形状。摘要告诉你 文件数、行数和受影响的语言。每个文件的条目告诉你 哪些函数更改了签名,添加了哪些导入,以及文件是否 生成(可以跳过)。

第二步:爆炸半径 get_function_context

对于步骤1中标识的更改的函数,请求函数上下文。这 告诉哪些其他文件调用了每个更改的函数,每个更改了什么 函数调用,以及哪些测试文件引用它。每个函数都包含一个 blast_radius 带有a的对象 risk 水平(none, low, medium, high) 根据生产呼叫者计数和测试覆盖率计算——按风险排序 首先查看影响最大的更改。代理人永远不必费力地通过 代码库,用于查找调用者或猜测要检查哪些测试。

第三步:深潜 get_file_snapshots

一旦您知道哪些文件和调用者很重要,请请求以下内容的完整快照 影响最大的文件。您在内容之前/之后完成-无需重建 来自diff-hunks的文件。使用 line_range 专注于特定的部分和 include_before: false 当你只需要当前状态时。通过 include_diff_hunks: true 为计算获得统一的差分块边界 diff相对行位置(例如,GitHub内联评论)。

这两条路径都保持了较低的令牌使用率。 review_change 是最有效的开始 大多数复习任务的分数;当你需要时,这三条呼叫路径是值得的 有针对性的重新查询或希望单独浏览大型清单 一个大的功能列表。

分页

get_change_manifest 和 get_commit_history 返回一个 pagination 对象打开 每个响应:

"pagination": {
  "total_items": 842,
  "page_start": 0,
  "page_size": 100,
  "next_cursor": "eyJvZmZzZXQiOjEwMCwiYmFzZV9zaGEiOiIuLi4ifQ=="
}

当 next_cursor 非null,将其作为 cursor 参数在 下一次调用以获取下一页。游标是一个不透明的base64有效载荷 其对页面偏移量加上解析的基/头SHA进行编码;服务器 拒绝SHA不再与后续提供的参考匹配的光标 调用,因此光标是针对 main..feature 不能对某个对象重复使用 不同的范围。宣言 summary 始终反映中的所有文件 变更集,无论返回哪个页面,因此代理都可以从中进行分类 在决定是否翻阅剩余的文件条目之前,请先浏览第1页。

page_size 在服务器端被夹紧到 1..=500 范围;价值观之外 范围是强制的,而不是被拒绝的。CLI(git-prism manifest, git-prism history)内部分页,始终返回完整 结果;光标合约仅通过MCP工具界面可见。

支持的语言

功能级别分析使用 树保姆 从源代码中提取函数、方法、导入和调用站点。

语言 扩展名 摘录
C .c, .h 函数、声明, #include 指令
C .cpp, .hpp, .cc, .cxx, .hh, .hxx 类/命名空间限定的方法、函数, extern "C" 阻碍, #include 指令
C .cs 方法、构造器, using 指令
去吧 .go 函数、方法、导入
Java .java 方法、构造函数、导入
JavaScript .js, .jsx 函数、导出函数、箭头函数、方法、导入
Kotlin .kt, .kts 函数、方法、扩展函数、导入
PHP .php 功能、方法, use 声明
python .py 功能、装饰功能、方法、导入
红宝石 .rb 方法、单例方法, require/require_relative
生锈 .rs 函数、方法、use语句
Swift .swift 函数、方法、init声明、导入
TypeScript .ts, .tsx 函数、导出函数、箭头函数、方法、导入

不支持的语言的文件仍然显示在清单中 行/大小/更改类型元数据-- functions_changed 是 null (不是空的 数组)来区分“没有语法可用”和“已分析,没有更改”

内容感知功能存在差异

通过比较函数体的SHA-256哈希值来检测函数更改 内容,而不是行位置。这意味着:

  • 重新排序的函数 (移动但未修改)不产生更改条目, 消除了浪费试剂注意的假阳性。
  • 仅身体变化 (相同的签名,不同的实现)被检测到 作为 modified,即使行号没有移动。
  • 重命名函数 当一个不匹配的添加函数共享一个 带有不匹配的已删除函数的体哈希。这些产生了一个单一 renamed 进入与 old_name 已填充,而不是单独 deleted + added.

这 change_type 函数的值为: added, modified, deleted, signature_changed, renamed。重命名的条目在中包含以前的名称 这 old_name 字段(所有其他变量为空),以便代理可以关联 将函数重命名回其历史记录。

空白和评论敏感性。 主体哈希值是在原始哈希值上计算的 树视图中函数体的字节跨度。重新格式化运行, 注释添加或删除、尾随空格更改和缩进 因此,shift将改变哈希值并产生 modified 即使在 可执行逻辑不变。未来的版本可能会规范空白 并在哈希之前删除评论;在此之前,在文件上运行格式化程序 将显示每个触摸的功能 modified 在下一次清单呼叫时。

依赖文件跟踪

git prism解析添加、删除和版本更改的依赖文件和报告 包装:

  • Cargo.toml (生锈)
  • package.json (Node.js)
  • go.mod (去)
  • pyproject.toml (Python,PEP 621)

遥测

可选的OpenTetry仪器,默认情况下禁用,并通过环境变量选择加入。

变量 目的 默认值
GIT_PRISM_OTLP_ENDPOINT OTLP gRPC终结点URL。未设置时,遥测功能被禁用。 未设置(禁用)
GIT_PRISM_OTLP_HEADERS 计划中,尚未连接(#43).设置此变量今天无效;需要身份验证标头的托管OTLP后端需要一个本地收集器代理。 未设置
GIT_PRISM_SERVICE_NAME 服务名称已报告给后端。 git-prism
GIT_PRISM_SERVICE_VERSION 服务版本已报告给后端。 板条箱版本
GIT_PRISM_PASSTHROUGH 设置为 1 或 true 在一次调用中完全跳过匀场处理和遥测。看 每次调用选择退出. 未设置
GIT_PRISM_DISABLE 别名为 GIT_PRISM_PASSTHROUGH. 未设置

快速开始使用Jaeger(任何兼容OTLP的后端都可以):

docker run -d --name jaeger -p 4317:4317 -p 16686:16686 jaegertracing/all-in-one:latest
GIT_PRISM_OTLP_ENDPOINT=http://localhost:4317 git-prism serve

隐私: 不导出原始路径、文件内容、作者姓名或引用名称。路径是 SHA-256哈希;refs标准化为有界枚举。看 docs/telemetry.md.

贡献

看 贡献.md.

许可证

阿帕奇-2.0