NotCommitError Дульвича при попытке разрешить теги
Я работаю с dulwich над проектом, где мне нужно клонировать репозитории, иногда по идентификатору коммита, иногда по тегу, иногда по имени ветки. У меня проблемы с тегом, который, кажется, работает для некоторых репозиториев, но не для других.
Вот "clone
"вспомогательная функция, которую я написал:
from dulwich import index
from dulwich.client import get_transport_and_path
from dulwich.repo import Repo
def clone(repo_url, ref, folder):
is_commit = False
if not ref.startswith('refs/'):
is_commit = True
rep = Repo.init(folder)
client, relative_path = get_transport_and_path(repo_url)
remote_refs = client.fetch(relative_path, rep)
for k, v in remote_refs.iteritems():
try:
rep.refs.add_if_new(k, v)
except:
pass
if ref.startswith('refs/tags'):
ref = rep.ref(ref)
is_commit = True
if is_commit:
rep['HEAD'] = rep.commit(ref)
else:
rep['HEAD'] = remote_refs[ref]
indexfile = rep.index_path()
tree = rep["HEAD"].tree
index.build_index_from_tree(rep.path, indexfile, rep.object_store, tree)
return rep, folder
Как ни странно я умею делать
clone('git://github.com/dotcloud/docker-py', 'refs/tags/0.2.0', '/tmp/a')
Но
clone('git://github.com/dotcloud/docker-registry', 'refs/tags/0.6.0', '/tmp/b')
не удается с
NotCommitError: object debd567e95df51f8ac91d0bb69ca35037d957ee6
type commit
[...]
is not a commit
Обе ссылки являются тегами, поэтому я не уверен, что я делаю неправильно или почему код ведет себя по-разному в обоих репозиториях. Был бы признателен за любую помощь, чтобы разобраться в этом!
1 ответ
refs/tags/0.6.0 - это аннотированный тег. Это означает, что ссылка для него указывает на объект Tag (который затем имеет ссылку на объект фиксации), а не непосредственно на объект Commit.
В этой строке:
if is_commit:
rep['HEAD'] = rep.commit(ref)
else:
rep['HEAD'] = remote_refs[ref]
Вы, вероятно, просто хотите сделать что-то вроде:
if isinstance(rep[ref], Tag):
rep['HEAD'] = rep[ref].object[1]
else:
rep['HEAD'] = rep[ref]