web-dev-qa-db-ja.com

gitpythonでコミットの短いshaを取得します

長いSHAは次のように取得できます:

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

短いものはどうですか? (短いSHAはリポジトリのスケールによって決定されるため、sha[:7]のようにしないでください)

15
Kentaro Wada

私の知る限り、gitpython Commitオブジェクトは短いshaを直接サポートしていません。ただし、それでもgitpythonの gitを直接呼び出すためのサポート を使用して取得できます。

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

これは実行するのと同じです

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

コマンドラインで、 短いハッシュを取得する通常の方法 。これにより、長さが4以上の可能な限り最短の明確なハッシュが返されます(より少ない数を渡すこともできますが、gitの内部最小値は4であるため、同じ効果があります)。

14
lemonhead

ここでrev-parseshort引数を使用して、コミットを一意に識別できる最小のSHAを生成する必要があります。基本的に、shortは内部gitAPIを呼び出し、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のmanページ で説明したように、-shortはデフォルトで値として7を取り、最小値は4です。

--short=number

オブジェクト名の完全なSHA-1値を出力する代わりに、それらをより短い一意の名前に省略してみてください。長さが指定されていない場合、7が使用されます。最小の長さは4です。

5
mu 無

すでに提供されている回答は、シェルを介してrev-parseを呼び出していることを前提としていますが、これは低速です。リポジトリへの参照がすでにある場合は、次のように文字列を切り捨ててCommitオブジェクトのname_revプロパティにアクセスすることでこれを行うことができます。参照は指定した長さ(ここでは8)に固定されていますが、機能します。

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

このコマンドの実際の出力は、完全なsha、スペース、ブランチ名の順です。

0
P. Myer Nore