-1

履歴から特定のアイテムを取得するために、裸の git リポジトリの (ローカル) ディレクトリにアクセスする必要があるプロジェクトがあります。ディレクトリを反復処理して次のようなことを行う関数が必要です。

repo = pygit2.discover_repository("/path/to/repo")

forしかし、これをループで実行できる必要があります。

各リポジトリは異なるプロジェクト用であり、その名前は、コード内の他の場所でネストされたループを使用してリストに配置および保存されます。

repo1)コード全体でリストインデックスに基づいてプロジェクト名のみを参照する場合、上記の代わりにプロジェクト名を使用することは理repo_nにかなっていますか?リポジトリを検出するループの各反復で増分されます)?

2) これらのリポジトリをforループで検出して、すべてを一度に取得できるようにすることは可能ですか?それとも、1 つずつ行う必要がありますか?

3)これをループで実行できる場合、プロジェクト名と新しく発見されたリポジトリ オブジェクトを含むタプル (または辞書) を作成するにどうすればよいですか?

4

1 に答える 1

0

最初は、次のようなコードから始めました。

name = 'repo_'
i = 0
repo_list = {}
items = get_items() # defined elsewhere

for item in os.listdir(dirpath):
    i = i + 1 # this was just to add a custom name to the repos located
    repo_name = name + str(i)
    path_to_repo = os.path.join(dirpath, item)

    repo = pygit2.discover_repository(path_to_repo)
    repo_list[item] = repo

stringしかし、これはオブジェクトのリストではなく、オブジェクトのリストを返していましたRepository。この関数は、Repository オブジェクトではなく、リポジトリへのパスdiscover_repository()を返すことが判明しました。私は言わなければなりません、私はpygit2 documentationのどこにも関数を見つけられませんでした.そして、私がこの SO questionを見つけるまで、誰もそれを使用したり話したりするのを見たことがありませんでした. しかし今、私は知っています(そして、将来の読者にも役立つと思います):discover_repository()

pygit2 のdiscover_repository(path)関数は、見つかったリポジトリへのパスの文字列表現を返します。これは Repository オブジェクトではないため、インスタンス化する必要があります。

そのため、どこでも答えを探した後、次のスニペットを見つけました。これには、見逃していた行が含まれていました。

    path_to_repo = os.path.join(dirpath, item)

    repo = pygit2.discover_repository(path_to_repo)
    repo_name = Repository(repo) # this line was missing
    repo_list[item] = repo_name

近くにいますが、ここで何かがずれています。確かに、これは私が望んでいたことですが、それは少し冗長ではありませんか? 後で、コードの別のセクションに取り組んだ後、forループ全体としてこれだけになりました。

for item in os.listdir(dirpath):
    i = i + 1
    repo_name = name+str(i)
    path_to_repo = os.path.join(dirpath, item)

    repo_name = Repository(path_to_repo)
    repo_list[item] = repo_name

これにより、目的の結果が得られます。次のような辞書が返されました。

{'repo_1': [listOfRepositoryObjects], 'repo_2': [anotherListOfRepositoryObjects]}

pygit2.discover_repository()で同じことを行うものを含めたので、実際には関数はまったく必要ありませんでしたpath_to_repo = os.path.join(dirpath, item)。彼らは同じものを返すことになったので、私のプロジェクトの要件により適しているように見えるので、私が書いた関数を使用します。

于 2016-04-01T13:00:44.703 に答える