Python编写git pre-commit钩子无法获取入参问题咨询
问题原因
原生Git调用pre-commit钩子时,默认不会传入任何参数,你测试得到的sys.argv结果属于正常现象,和Python版本、Git客户端(Git Desktop/GitBash)无关。
你之前看到的能拿到入参的场景,通常属于两种情况:
- 对方使用了第三方pre-commit管理框架(如Python生态常用的pre-commit工具链),这类框架会给自定义钩子脚本传入额外的自定义参数,不属于原生Git的行为
- 对方使用的是其他类型的Git钩子,例如
commit-msg(会传入提交消息文件路径)、pre-receive等,这类钩子本身就有Git默认传入的参数,和pre-commit的设计不同
解决方案
如果需要在pre-commit钩子中获取提交相关的信息,可以通过调用Git命令直接获取,不需要依赖入参:
示例:获取本次提交的修改文件列表
import sys import subprocess def main(): # 获取暂存区中新增/修改的文件列表 changed_files = subprocess.check_output( ["git", "diff", "--cached", "--name-only", "--diff-filter=ACM"], text=True ).splitlines() print("本次提交修改的文件:", changed_files) # 后续可以针对这些文件做格式检查、扫描等逻辑 sys.exit(1) if __name__ == "__main__": main()
如果需要传递自定义参数,可以通过环境变量实现:执行commit前先导出你需要的环境变量,在钩子脚本中直接读取os.environ即可获取对应值。
内容的提问来源于stack exchange,提问作者Joulain
相关产品推荐
相关产品推荐

