Создайте коммит с помощью pygit2

Я хотел бы сделать коммит на ветке (например, master).

Я делаю клон репозитория, используя pygit2 (pygit2.clone_repository)

Затем я изменяю существующий файл в репозитории.

После этого я запускаю это, чтобы сделать коммит:

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

Но когда я захожу в репозиторий и запускаю git status:

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

Измененный файл кажется добавленным для фиксации, но фиксация не удалась. Используя возвращенный Oid, я могу найти атрибут фиксации в репозитории pygit2.

Я что-то пропустил ?


person user1479699    schedule 06.04.2015    source источник
comment
Я не вижу, чтобы в вашем коде где-то упоминалась ветка, может быть, вам следует указать это где-то?   -  person Thom Wiggers    schedule 06.04.2015
comment
Значение ссылки 'ref/heads/master'   -  person user1479699    schedule 06.04.2015
comment
У меня возникли проблемы с поиском достойной документации для pygit2, поэтому я просто предполагаю: я вижу, что вы вызываете различные методы write() после некоторых изменений состояния. create_commit() пишет неявно или вы забыли это сделать?   -  person Thom Wiggers    schedule 06.04.2015
comment
Я пытался сделать: репозиторий.index.write_tree() после create_commit, но я получил тот же результат   -  person user1479699    schedule 06.04.2015


Ответы (2)


Написав

tree = repository.TreeBuilder().write()

вы создаете пустое дерево, а затем указываете его как дерево для фиксации, что означает, что вы удалили каждый файл (что вы можете увидеть, если запустите git show HEAD после запуска вашего кода).

Вместо этого вы хотите сделать

tree = index.write_tree()

который хранит данные в индексе в виде дерева (создавая то, что отсутствует) в репозитории, и это то, что происходит, когда вы запускаете команду, например git commit. Затем вы можете передать это дерево методу создания фиксации, как вы делаете сейчас.

person Carlos Martín Nieto    schedule 08.04.2015

Проблема в том, что вы только что создали коммит, но не обновили ссылку HEAD. После создания коммита вручную обновите ссылку HEAD, чтобы решить эту проблему.

repo.head.set_target(oid)
person crab2313    schedule 20.03.2018