2015-04-06 14 views
6

Ich möchte einen Commit auf einem Zweig (Master zum Beispiel) machen.Erstellen Sie ein Commit mit pygit2

Ich bilde einen Repository-Klon mit pygit2 (pygit2.clone_repository)

Dann wechsle ich eine vorhandene Datei im Repository.

Danach laufe ich dies eine Festschreibung zu machen:

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]) 

Aber wenn ich in das Repository gehen und laufen git status:

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

Die modifizierte Datei für begehen, aber die hinzugefügt werden, scheint zu begehen war nicht erfolgreich. Mit der zurückgegebenen OID kann ich das commit-Attribut im pygit2-Repository finden.

Habe ich etwas übersehen?

+0

Ich sehe nicht, dass Ihr Code irgendwo einen Zweig erwähnt, vielleicht sollten Sie das irgendwo angeben? –

+0

Der Wert der Referenz lautet 'ref/heads/master' – user1479699

+0

Ich habe Probleme, eine anständige Dokumentation für pygit2 zu finden, also rate ich nur: Ich sehe, dass Sie nach einigen Zustandsänderungen verschiedene 'write() 'Methoden aufrufen . 'Create_commit()' schreibt implizit oder vergisst du das? –

Antwort

3

Durch das Schreiben

tree = repository.TreeBuilder().write() 

Sie einen leeren Baum erstellen und Sie geben diese dann als Baum für das Commit, was bedeutet, dass Sie jede Datei gelöscht haben (die Sie sehen können, wenn Sie laufen git show HEAD nach dem Ausführen Ihres Codes).

Was wollen Sie stattdessen zu tun ist

tree = index.write_tree() 

, die die Daten in dem Index als Baum speichert (Erstellen je nachdem, was fehlen) im Repository und ist das, was passiert, wenn Sie einen Befehl wie git commit laufen. Sie können diese Baumstruktur dann an die Methode zum Erstellen von Commits übergeben, so wie Sie es jetzt tun.