Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

mcp-server-git: git_status and the git_diff tools print non-ASCII paths as octal escapes, so git_add cannot take them back

已关闭
#5,129 3 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
57/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
git, python

调研方向

Read src/git/src/mcp_server_git/server.py, especially the git_status and diff tool implementations around the reported line 155. Reproduce with the supplied Python script and a filename containing non-ASCII characters; the issue also points to PR #4879 and four tests as reference. Done when status and all three diff tools return paths that can be passed to git_add.

由索引模型根据 Issue 内容生成。

描述

bug server-git v2
Which server?

git (mcp-server-git)

Server version

2026.10.10, from v2/main at 2f8dc42

How did you run the server?

From a clone of this repository

Transport

stdio

Protocol era

Not sure. The repro calls the tool functions in-process, so it does not depend on the era.

MCP client and version

n/a, the tool functions were called directly from Python

Operating system and runtime

Linux, Python 3.10.21, git 2.43.0, GitPython 3.2.0

Server configuration

None beyond uv sync --frozen --dev in src/git.

Steps to reproduce
  1. In a fresh repository, create an untracked file named 日本.txt.
  2. Call git_status, strip the surrounding double quotes from the name it prints, and pass that name to git_add.
  3. Save the script below as repro.py in src/git and run it.
repro.py
import pathlib, subprocess, tempfile
import git
import mcp_server_git.server as s
d = pathlib.Path(tempfile.mkdtemp())
subprocess.run(["git", "init", "-q", str(d)], check=True)
r = git.Repo(d)
(d / "日本.txt").write_text("a\n")
print("--- git_status")
st = s.git_status(r)
print("\n".join(l for l in st.splitlines() if "Untracked" in l or ".txt" in l))
name = [l.strip() for l in st.splitlines() if ".txt" in l][0].strip('"')
r.git.add("日本.txt")
print("--- git_diff_staged (headers)")
print("\n".join(l for l in s.git_diff_staged(r).splitlines() if l.startswith("diff --git")))
r.git.rm("--cached", "-q", "日本.txt")
print("--- git_add with the name git_status printed")
try:
    s.git_add(r, [name])
except Exception as e:
    print(type(e).__name__ + ":", str(e).split("stderr: ")[-1].strip().strip("'"))
print("--- the same status with -c core.quotepath=false")
print("\n".join(l.strip() for l in r.git(c="core.quotepath=false").status().splitlines() if ".txt" in l))
$ uv run python repro.py      # src/git at 2f8dc42
--- git_status
Untracked files:
	"\346\227\245\346\234\254.txt"
--- git_diff_staged (headers)
diff --git "a/\346\227\245\346\234\254.txt" "b/\346\227\245\346\234\254.txt"
--- git_add with the name git_status printed
GitCommandError: fatal: pathspec '\346\227\245\346\234\254.txt' did not match any files
--- the same status with -c core.quotepath=false
日本.txt
Expected behavior

git_status and the three diff tools print 日本.txt, a name a client can pass back to git_add.

Actual behavior

src/git/src/mcp_server_git/server.py:155 calls repo.git.status() with git's default core.quotepath=true, so every non-ASCII path comes back as quoted octal escapes. git_diff_unstaged, git_diff_staged and git_diff do the same.

Already prototyped a fix?

#4879 by @tsurutanmen has the change and four tests for it, written against main. It runs the four commands with -c core.quotepath=false.

Before you submit
  • I searched existing issues and this is not a duplicate.
  • This is not a security vulnerability report (those go through the private advisory form).

@cliffhall could this go on the board for the git server?

主要语言
TypeScript
星标
91.6k
派生
11.9k
平均合并
5 小时 18 分钟
30 天内合并 PR
185

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

modelcontextprotocol/servers 的其他 Issue

查看 modelcontextprotocol/servers 的全部 Issue

相似的 Issue

更多 TypeScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。