提交前的Git diff调用抛出“致命的:无法读取[SHA1]”

问题描述 投票:0回答:2

我正在Windows中工作,并试图在存储库的预提交脚本(Python)中运行git diff命令。我的Python调用看起来像这样:

repo_dir = 'D:/git/current_uic/src/gtc/resource'
cmd = ['diff', '--name-only']
print(Popen(['git', '--git-dir={}'.format(repo_dir + '/.git'), 
             '--work-tree={}'.format(repo_dir)] + cmd,
            stdin=PIPE, stdout=PIPE).communicate())

[每当我去提交“ D:/ git / current_uic / src / gtc”仓库时,我都会得到以下信息:

fatal: unable to read 6ff96bd371691b9e93520e133ebc4d84c74cd0f6

请注意,这是'D:/ git / current_uic / src / gtc'存储库的预提交钩子,'D:/ git / current_uic / src / gtc / resource'是'D:/ git / current_uic / src / gtc”。还要注意,如果我弹出打开Git bash并运行以下命令:

git --git-dir=D:/git/current_uic/src/gtc/resource/.git 
    --work-tree=D:/git/current_uic/src/gtc/resource diff --name-only

或者,如果我只是直接从Git bash运行脚本,那么无论工作目录如何,我都能得到我想要的。

关于这里发生的事情有什么想法吗?

python git githooks
2个回答
2
投票

问题:

运行钩子后,Git设置了一些可以由钩子脚本访问的环境变量。问题在于,Git本身使用了这些环境变量,当钩子被触发时,Git设置/使用它们的正常方法似乎被设置的值所覆盖。在此特定情况下,环境变量GIT_INDEX_FILE已设置为索引文件的路径,该索引文件对应于已调用该钩子的存储库(D:/git/current_uic/src/.git/modules/gtc/index),导致(错误的)索引和(正确的)更改树之间不匹配。

修复:

在挂钩脚本中,在进行任何git调用之前,将环境变量GIT_INDEX_FILE设置为正确的值。在这种情况下,您可以执行以下操作:

set GIT_INDEX_FILE=D:/git/current_uic/src/.git/modules/gtc/modules/resource/index
git --git-dir=D:/git/current_uic/src/gtc/resource/.git 
    --work-tree=D:/git/current_uic/src/gtc/resource diff --name-only

其他信息

有关这些Git环境变量及其设置的钩子的更多信息,请参见here。>>


0
投票

完全相同的问题,但是使用了gitpython。我这样解决了:

© www.soinside.com 2019 - 2024. All rights reserved.