如何在裸Git仓库中使用git blame --ignore-revs-file命令?
裸Git仓库中使用
git blame --ignore-revs-file的解决方案 问题原因
裸Git仓库没有工作区(working tree),仓库内的文件(比如.git-blame-ignore-revs)并不是以普通文件的形式存放在文件系统里,而是存储在Git的对象数据库中。所以直接用相对路径指定仓库内的文件时,Git找不到对应的文件,就会报错。
可行的解决方法
1. 使用外部路径的文件
这是你已经验证过的方法:把.git-blame-ignore-revs文件复制到裸仓库外的任意路径(比如/tmp/),然后用绝对路径指定:
git blame --ignore-revs-file /tmp/.git-blame-ignore-revs add.txt
2. 从Git对象中提取文件内容到临时文件
因为.git-blame-ignore-revs是仓库内的文件(假设它在main分支下存在),可以用git show命令从Git对象数据库中提取它的内容,再传递给git blame:
# 提取内容到临时文件 git show main:.git-blame-ignore-revs > /tmp/ignore-revs.txt # 执行blame命令 git blame --ignore-revs-file /tmp/ignore-revs.txt add.txt # 清理临时文件 rm /tmp/ignore-revs.txt
如果用支持进程替换的Shell(比如bash),可以一步完成,不用手动清理临时文件:
git blame --ignore-revs-file <(git show main:.git-blame-ignore-revs) add.txt
为什么--参数无效
你尝试的git blame --ignore-revs-file -- .git-blame-ignore-revs add.txt之所以报错,是因为--之后的.git-blame-ignore-revs会被Git当作**版本号(revision)**解析(比如提交哈希、分支名),但它并不是一个有效的版本标识,所以会提示“bad revision”。在裸仓库中,这个字符串无法对应到任何Git对象,自然失败。
总结
裸仓库无法直接引用仓库内的文件路径(因为没有工作区),必须通过上述两种方式,把文件内容放到Git能识别的普通文件路径中,才能正常使用--ignore-revs-file选项。
内容的提问来源于stack exchange,提问作者Harish Gajapathy
相关产品推荐
相关产品推荐

