我对如何正确实现 git 钩子有点困惑,我无法弄清楚如何从脚本中访问我需要的任何类型的信息。我几乎没有编写脚本/使用Python的经验。
我只想访问即将在预提交钩子中提交的文件的文件名(以及稍后的文件内容),以便我可以检查它们是否与命名约定匹配。我看过这样的帖子 Git 服务器钩子:获取正在推送的文件的内容?,其中海报提到他如何通过调用 git diff --cached --name-status --diff-filter=AM
来获取文件列表。
如果这是一个愚蠢的问题,我很抱歉,但是我如何从脚本中调用此行并将其设置为等于某些内容?我承认该行是 Git 命令,但我对如何将其转换为编码感到困惑。它在python中是什么样子的?
这是我目前为预提交提供模板的全部内容。它只是在Python中进行测试打印。
#!/usr/bin/env python
import sys
print("nError detailsn")
git diff-index --name-status HEAD | grep '^[MA]'
这是我所知道的最可靠的方法。 它打印出带有 M 或 A 前缀的名称,后跟一些空格,后跟名称,以指示文件是"修改"还是"添加"。
不过,还有一些额外的魔法。 我建议:
git stash --keep-index
git diff-index --name-status HEAD | grep '^[MA]'
git reset --hard
git stash pop --quiet --index
这将为你提供暂存区域中的名称列表(通过存储自上次git add
命令以来所做的任何更改),并在之后立即恢复工作区。 由于你的暂存区域,而不是你的工作区,是你将要提交的,所以这可能是你想要的。
我有一个程序可以在 https://github.com/elfsternberg/pre-commit-stash 完成所有这些
工作它是用Hy写的,Hy是Python的一种方言,大多数人几乎不知道甚至读不懂。 不过,Hy 确实带有一个 hy2py 转译器,所以如果你真的需要它,这个脚本会告诉你它是如何完成的。