Я пытаюсь воспроизвести поведение команды «git checkout (commit)», где (commit) — это ссылка на конкретную фиксацию, а не имя ветки.
При использовании этой команды «ГОЛОВА» репозитория указывает на фиксацию (отделенная головка), а рабочий каталог находится в том же состоянии, что и в этой фиксации.
На данный момент мне удалось сделать так, чтобы HEAD репозитория указывал на фиксацию с помощью PyGit2:
def go(self, repo_name, version):
repo = pygit2.Repository(bdd[repo_name])
#commit = repo.revparse_single(version)
#repo.reset(version, pygit2.GIT_RESET_HARD)
repo.set_head(pygit2.Oid(hex=version))
print repo.head_is_detached
Моя проблема в том, что я не могу найти, как откатить рабочий каталог, как это делает Git CLI. Я пытался использовать:
repo.checkout_head()
: ничего не делает в рабочем каталоге.repo.checkout()
: Сбой сGitError: X conflicts prevent checkout
Есть ли способ воспроизвести это поведение без использования Repository.reset(ref, pygit2.GIT_RESET_HARD)
?
repo.checkout()
? - person Nils Werner   schedule 10.05.2017repo.checkout()
после того, как изменил HEAD, чтобы он указывал на фиксацию. На данный момент рабочий каталог содержит все, что было в последней сделанной фиксации, поэтому рабочий каталог не является чистым с точки зрения HEAD, я думаю. - person Maeln   schedule 10.05.2017set_head()
(это делает рабочее пространство грязным) иcheckout()
(ожидается, что рабочее пространство будет чистым). Просто используйтеcheckout()
. - person Nils Werner   schedule 10.05.2017Repository.checkout(ref)
берет ссылку и не принимает объектCommit
, ни его шестнадцатеричное представление, ни Oid. Поэтому я не могу найти, какcheckout()
выполнить конкретную фиксацию в pygit2. - person Maeln   schedule 10.05.2017repo.checkout(version)
гдеversion
строка sha1 не работает? - person Nils Werner   schedule 10.05.2017Repository.checkout(ref)
вызоветlookup_reference(refname)
, если переданный вами объект не является ниReference
, ни'HEAD'
. Если вы дадите емуCommit
или коммитOid
, он вернет ошибку типа (lookup_reference принимает только строку), а если вы дадите строку SHA1 коммита, он вернетValueError: (commit string): The given reference name (commit string) is not valid
. - person Maeln   schedule 10.05.2017checkout()
показывать ошибкуGitError: X conflicts prevent checkout
? - person Nils Werner   schedule 10.05.2017checkout()
без каких-либо аргументов. Если вы это сделаете, он сделаетcheckout_index()
. Этоcheckout_index()
, которые действительно возвращаютGitError: X conflicts ...
. - person Maeln   schedule 10.05.2017git read-tree -um HEAD $target && git update-ref HEAD $target
; pygit2, по-видимому, понимает только чтение одного дерева и ни один из вариантов этого, поэтому, несмотря на то, что он выполняет проверку и слияние, а также любое количество других операций, он не предлагает ничего, кроме грубого макета фактического git. Похоже, вы могли бы добавить ссылку на свой коммит, проверить это, затем сброситьHEAD
и удалить ссылку. - person jthill   schedule 12.05.2017pygit2
, это почти невозможно, так почему бы просто не запустить исходную команду git напрямую, вместо того, чтобы тратить энергию на ее моделирование через pygit2? - person Done Data Solutions   schedule 15.05.2017