我正在与dulwich合作一个项目,在这个项目中,我需要克隆存储库,有时通过提交id,有时通过标记,有时通过分支名称。我对标签盒有问题,它似乎对某些存储库有效,但对其他存储库无效。
下面是我编写的“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
两个ref都是标记,所以我不确定我做错了什么,也不知道为什么代码在两个存储库上的行为不同。如果能帮忙解决这个问题,我将不胜感激!
最佳答案
refs/tags/0.6.0是带注释的标记。这意味着它的ref指向一个标记对象(然后该标记对象具有对commit对象的引用),而不是直接指向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]
关于python - 尝试解析标签时dulwich的NotCommitError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18985829/