5

私は、gitリポジトリでファイルを追加および更新するプログラムに取り組んでいます。作業中のファイルが現在リポジトリにあるかどうかわからないため、その存在を確認する必要があります。これは、思ったよりも難しいようです。

'in' 比較は、gitpython のツリーの非ルート レベルでは機能しないようです。元。

>>> repo = Repo(path)
>>> hct = repo.head.commit.tree
>>>> 'A' in hct['documents']
False
>>> hct['documents']['A']
<git.Tree "8c74cba527a814a3700a96d8b168715684013857">

だから私は疑問に思っています.与えられたファイルがgitツリーにあることを、作業を試みる前にどのようにチェックするのですか? ツリーにないファイルのオブジェクトにアクセスしようとすると KeyError がスローされるため、try-catch を実行できます。しかし、それは定期的な存在チェックのための例外処理の不適切な使用のように感じます.

本当に明らかなことを見逃していませんか?gitpython (または実際には Python の任意のライブラリ/メソッド) を使用して、コミット ツリー内のファイルの存在を確認するにはどうすればよいですか?

自己回答

OK、私は__contains__ が何をするかを見るためにTree クラスを掘り下げました。サブフォルダーを検索するときは、リポジトリのルートからの完全な相対パスを使用してファイルの存在を確認する必要があります。したがって、上記で行ったチェックの動作バージョンは次のとおりです。

>>> 'documents/A' in hct['documents']
True
4

3 に答える 3

2

ビルのソリューションを拡張すると、ファイルがレポにあるかどうかを判断する関数があります。

def fileInRepo(repo,path_to_file):
    '''
    repo is a gitPython Repo object
    path_to_file is the full path to the file from the repository root
    returns true if file is found in the repo at the specified path, false otherwise
    '''
    pathdir = os.path.dirname(path_to_file)

    # Build up reference to desired repo path
    rsub = repo.head.commit.tree
    for path_element in pathdir.split(os.path.sep):
        rsub = rsub[path_element]
    return(path_to_file in rsub)

使用例:

file_found = fileInRepo(repo, 'documents/A')
于 2013-01-16T17:46:29.547 に答える