使用 gitpython 获取 commit 的简短 sha
get short sha of commit with gitpython
长SHA可以像下面这样得到:
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha
或者,在 git 3.1.7 中:
sha = repo.head.commit.hexsha
短一个怎么样?
(短 SHA
由 repo 的规模决定,所以它不应该像 sha[:7]
)
据我所知,gitpython Commit
对象不直接支持短 sha。但是,您仍然可以使用 gitpython 的 support for calling git directly 来检索它(从 git 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 ...
在命令行上,即 the usual way of getting the short hash。这将 return 长度 >= 4 的最短可能的明确散列(您可以传入更小的数字,但由于 git 的内部最小值是 4,它将具有相同的效果)。
这里需要使用rev-parse
的short
参数来生成能够唯一标识commit的最小SHA。基本上,short
将调用内部 git API 和 return 可以唯一标识提交的 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'
你可以阅读more about this from the git side here. Also, as mentioned in the man-page for git-rev-parse,--short默认取7,最小取4。
--short=number
Instead of outputting the full SHA-1 values of object names try to abbreviate them to a shorter unique name. When no length is specified 7 is used. The minimum length is 4.
已经提供的答案假定您正在通过 shell 调用 rev-parse,这很慢。如果您已经有对 repo 的引用,则可以通过使用字符串截断访问 Commit 对象上的 name_rev 属性 来执行此操作,如下所示。引用固定在您提供的长度(此处为 8),但它有效:
repo.remotes.origin.refs['my/branch/name'].object.name_rev[:8]
此命令的实际输出是完整的 sha,后跟 space,然后是分支名称。
实际上,您需要使用
short_sha = repo.git.rev_parse(sha, short=True)
short=4 即使在我巨大的 git base
中也总是显示 4 个字母哈希
当前答案已过时,检索提交 sha 的方法是 commit.hexsha
。
与上面的相比,似乎有一种更短的写法:对于 gitpython 3.1.15,你可以简单地做
hash = repo.git.rev_parse(repo.head, short=True)
即您不需要明确获取
sha = repo.head.commit.hexsha
第一。
长SHA可以像下面这样得到:
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha
或者,在 git 3.1.7 中:
sha = repo.head.commit.hexsha
短一个怎么样?
(短 SHA
由 repo 的规模决定,所以它不应该像 sha[:7]
)
据我所知,gitpython Commit
对象不直接支持短 sha。但是,您仍然可以使用 gitpython 的 support for calling git directly 来检索它(从 git 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 ...
在命令行上,即 the usual way of getting the short hash。这将 return 长度 >= 4 的最短可能的明确散列(您可以传入更小的数字,但由于 git 的内部最小值是 4,它将具有相同的效果)。
这里需要使用rev-parse
的short
参数来生成能够唯一标识commit的最小SHA。基本上,short
将调用内部 git API 和 return 可以唯一标识提交的 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'
你可以阅读more about this from the git side here. Also, as mentioned in the man-page for git-rev-parse,--short默认取7,最小取4。
--short=number
Instead of outputting the full SHA-1 values of object names try to abbreviate them to a shorter unique name. When no length is specified 7 is used. The minimum length is 4.
已经提供的答案假定您正在通过 shell 调用 rev-parse,这很慢。如果您已经有对 repo 的引用,则可以通过使用字符串截断访问 Commit 对象上的 name_rev 属性 来执行此操作,如下所示。引用固定在您提供的长度(此处为 8),但它有效:
repo.remotes.origin.refs['my/branch/name'].object.name_rev[:8]
此命令的实际输出是完整的 sha,后跟 space,然后是分支名称。
实际上,您需要使用
short_sha = repo.git.rev_parse(sha, short=True)
short=4 即使在我巨大的 git base
中也总是显示 4 个字母哈希当前答案已过时,检索提交 sha 的方法是 commit.hexsha
。
与上面的相比,似乎有一种更短的写法:对于 gitpython 3.1.15,你可以简单地做
hash = repo.git.rev_parse(repo.head, short=True)
即您不需要明确获取
sha = repo.head.commit.hexsha
第一。