2015-04-06 21 views
6

Vorrei eseguire un commit su un ramo (master ad esempio).Creare un commit utilizzando pygit2

Sto creando un clone repository utilizzando pygit2 (pygit2.clone_repository)

Poi ho modificare un file esistente nel repository.

In seguito ho eseguito questo per fare un commit:

index = repository.index 
index.add_all() 
index.write() 
author = pygit2.Signature(user_name, user_mail) 
commiter = pygit2.Signature(user_name, user_mail) 
tree = repository.TreeBuilder().write() 
oid = repository.create_commit(reference, author, commiter, message,tree,[repository.head.get_object().hex]) 

ma quando vado al repository e corro git status:

On branch master 
Changes to be committed: 
(use "git reset HEAD <file>..." to unstage) 
new file: test.txt 

Il file modificato sembra essere aggiunto per commettere, ma il commit non ha avuto successo Usando l'OID restituito posso trovare l'attributo commit nel repository pygit2.

Mi sono perso qualcosa?

+0

Non vedo il tuo codice che menziona un ramo da qualche parte, forse dovresti specificarlo da qualche parte? –

+0

Il valore di riferimento è 'ref/heads/master' – user1479699

+0

Ho problemi a trovare documentazione decente per pygit2, quindi sto solo cercando di indovinare: sto vedendo che chiamate vari metodi 'write()' dopo aver fatto alcuni cambiamenti di stato . 'Create_commit()' scrive implicitamente o ti stai dimenticando di farlo? –

risposta

3

Scrivendo

tree = repository.TreeBuilder().write() 

si sta creando un albero vuoto e si sta quindi dando questo come l'albero per il commit, il che significa che hai eliminato tutti i file (che si può vedere se si esegue git show HEAD dopo aver eseguito il codice).

Che cosa si vuole fare, invece è

tree = index.write_tree() 

che memorizza i dati nell'indice come un albero (creando a seconda di quale mancano) nel repository ed è ciò che accade quando si esegue un comando come git commit. È quindi possibile passare questo albero al metodo di creazione del commit come si fa ora.