2015-08-12 12 views
9

La lunga SHA può essere ottenuto come di seguito:ottenere breve sha di impegnarsi con gitpython

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

Come su corta? (breve SHA è deciso dalla scala del pronti contro termine, quindi non dovrebbe essere come sha[:7])

risposta

7

Per quanto posso dire, l'oggetto gitpython Commit non supporta direttamente la breve sha. Tuttavia, è possibile utilizzare ancora gitpython di support for calling git directly per recuperare esso:

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

questo è l'equivalente di correre

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

sulla riga di comando, che è the usual way of getting the short hash. Ciò restituirà l'hash non ambiguo più breve possibile della lunghezza> = 4 (Potresti passare un numero più piccolo, ma dato che il min interno di git è 4 avrà lo stesso effetto).

+0

Grazie. in realtà, non voglio usare il comando shell, perché rende lo script eseguito molto più lentamente .. forse la lunghezza fissa dell'hash funziona nella maggior parte dei casi, quindi lo userò. –

+0

Hmm ... intendi il bombardamento diretto o l'uso del database git-command interno a 'gitpython'? Usando 'repo.git.revparse()' come ho suggerito il secondo, e dovrebbe essere molto veloce. Se la tua preoccupazione è il consumo di memoria o la generazione di nuovi proc, puoi invece usare 'git.Repo (odbt = GitDB)' per una soluzione pure-python, anche se viene eseguita 2-5 volte più lentamente. – lemonhead

+0

Sembra che 'repo.head.object.hexsha' non chiami il comando shell, e questo è l'ideale. perché sto correggendo informazioni sullo stato di git per visualizzarlo nel prompt della shell. (quindi dovrebbe essere veloce) –

3

È necessario utilizzare l'argomento short di rev-parse qui per generare lo SHA più piccolo in grado di identificare in modo univoco il commit. Fondamentalmente, lo short chiamerà l'API git interna e restituirà la stringa di lunghezza più breve possibile per SHA, che può identificare in modo univoco il commit, anche se in breve hai passato un valore molto piccolo. Così in modo efficace, si può fare qualcosa di simile al di sotto, che vi darà la SHA più breve sempre (io uso short=1 sottolineare che):

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' 

Si può leggere more about this from the git side here. Inoltre, come menzionato nella man-page for git-rev-parse, --short per impostazione predefinita prendere 7 come valore, e minimo 4.

--short=number

Invece di emettere i valori completi SHA-1 dei nomi degli oggetti cercare di abbreviare a un nome univoco più breve. Quando non viene specificata alcuna lunghezza, viene utilizzato 7. La lunghezza minima è 4.

0

Le risposte già fornite presuppongono che si chiami rev-parse attraverso la shell, che è lento. Se si dispone già di un riferimento al repository, è possibile farlo accedendo alla proprietà name_rev sull'oggetto Commit con il troncamento della stringa nel modo seguente. Il riferimento è fissata alla lunghezza fornite (qui, 8), ma funziona:

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

l'uscita effettiva di questo comando è lo sha completo, seguito da uno spazio, seguito dal nome del ramo.