20

长 SHA 可以得到如下:

repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha

或者,在 git 3.1.7 中:

sha = repo.head.commit.hexsha

短的怎么样?(shortSHA由repo的规模决定,所以不应该是这样的sha[:7]

4

6 回答 6

16

据我所知, gitpythonCommit对象不直接支持短 sha。但是,您仍然可以使用 gitpython对直接调用 git 的支持来检索它(从 gi​​t 3.1.7 开始):

repo = git.Repo(search_parent_directories=True)
sha = repo.head.commit.hexsha
short_sha = repo.git.rev_parse(sha, short=4)

这相当于运行

git rev-parse --short=4 ...

在命令行上,这是获取短 hash 的常用方法。这将返回长度 >= 4 的最短可能的明确散列(您可以传入较小的数字,但由于 git 的内部最小值为 4,因此具有相同的效果)。

于 2015-08-12T06:21:40.213 回答
6

您将需要使用此处的short参数rev-parse来生成可以唯一标识提交的最小 SHA。基本上,short它将调用内部 git API 并返回可以唯一标识提交的 SHA 的最短可能长度字符串,即使您传递了一个非常小的短值。如此有效,您可以执行以下操作,这将始终为您提供最短的 SHA(我曾经short=1强调这一点):

In [1]: import git
In [2]: repo = git.Repo(search_parent_directories=True)
In [3]: sha = repo.head.object.hexsha
In [4]: short_sha = repo.git.rev_parse(sha, short=1)
In [5]: short_sha
Out[5]: u'd5afd'

您可以从 git 端阅读更多相关信息。此外,正如git-rev-parse 的手册页中所述,--short 默认将 7 作为其值,最小值为 4。

--short=number

不要输出对象名称的完整 SHA-1 值,而是尝试将它们缩写为更短的唯一名称。如果没有指定长度,则使用 7。最小长度为 4。

于 2015-08-12T06:42:59.780 回答
2

实际上,您需要使用

short_sha = repo.git.rev_parse(sha, short=True)

即使在我庞大的 git 库中,short=4 也总是显示 4 个字母哈希

于 2020-04-23T15:34:34.770 回答
1

与上述相比,似乎有一种更短的写法:对于 gitpython 3.1.15,你可以简单地做

hash = repo.git.rev_parse(repo.head, short=True)

即您不需要明确获得

sha = repo.head.commit.hexsha

第一的。

于 2021-05-10T12:07:56.040 回答
0

当前答案已过时,重试提交的 sha 的方法是commit.hexsha.

于 2020-08-17T15:16:42.020 回答
0

已经提供的答案假设您正在通过 shell 调用 rev-parse,这很慢。如果您已经拥有对 repo 的引用,则可以通过使用字符串截断访问 Commit 对象上的 name_rev 属性来执行此操作,如下所示。参考固定为您提供的长度(此处为 8),但它有效:

repo.remotes.origin.refs['my/branch/name'].object.name_rev[:8]

此命令的实际输出是完整的 sha,后跟一个空格,然后是分支名称。

于 2016-01-28T13:41:48.897 回答