3

私は、時々コミット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

どちらの参照もタグであるため、何が間違っているのか、または両方のリポジトリでコードの動作が異なる理由はわかりません。これを整理するための助けをいただければ幸いです!

4

1 に答える 1

2

refs/tags/0.6.0 は注釈付きタグです。これは、その参照が直接 Commit オブジェクトではなく、Tag オブジェクト (コミット オブジェクトへの参照を持つ) を指していることを意味します。

この行で:

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]
于 2013-10-27T08:35:52.260 に答える