如何在Git钩子脚本中访问提交的文件的内容和名称?

时间:2015-06-19 21:21:39

标签: python git hook

我对如何正确实现git hook感到困惑,我无法弄清楚如何从我的脚本中访问我需要的任何类型的信息。我对编写脚本/使用Python的经验很少。

我只想访问要在预提交挂钩中提交的文件的文件名(以及稍后的文件内容),以便我可以检查它们是否与命名约定匹配。我看过这样的帖子Git server hook: get contents of files being pushed?,海报提到他如何通过调用Private Sub CommandButton1_Click() sText = "Company: ABC Company" & vbNewLine & "Class Period: 2013-10-29 through 2014-10-22" & vbNewLine Set Reg1 = CreateObject("VBScript.RegExp") vText = "Missing" vText2 = "Missing" vText3 = "Missing" For i = 1 To 3 With Reg1 Select Case i Case 1 .Pattern = "(Company)\w*[:](.*?)\n" .Global = False Case 2 .Pattern = "(Class Period\s*[:]+\s*([\d-\s]*))" .Global = False Case 3 .Pattern = "(through+\s*([\d-\s]*))" .Global = False End Select End With If Reg1.Test(sText) Then Set M1 = Reg1.Execute(sText) For Each M In M1 If M.SubMatches.Count > 0 Then Select Case i Case 1 vText = Trim(M.SubMatches(1)) Case 2 vText2 = Trim(M.SubMatches(1)) Case 3 vText3 = Trim(M.SubMatches(1)) End Select End If Next End If Next i xlSheet.Range("A" & rCount) = vText xlSheet.Range("B" & rCount) = vText2 xlSheet.Range("C" & rCount) = vText3 xlWB.Close 1 End Sub 获取文件列表。

如果这是一个愚蠢的问题,我很抱歉,但如何在我的脚本中调用此行并将其设置为等于某些内容?我认为这行是一个Git命令,但我很困惑如何转换为编码。它在python中是什么样的?

这是我目前为我的预提交模板所拥有的所有内容。它只是在Python中进行测试打印。

git diff --cached --name-status --diff-filter=AM

1 个答案:

答案 0 :(得分:2)

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语写的,这是Python的一种方言,大多数人几乎都不知道甚至不能阅读。 Hy确实带有一个hy2py转换器,所以如果你真的需要它,这个脚本会告诉你它是如何完成的。