0

GitPython0.3でファイルをリポジトリにコミットしようとしています。大まかに、私はこれを次のように行っています:

data = ...
istream = repo.odb.store(gitdb.IStream(git.Blob.type, len(data), StringIO(data)))
entry = git.BaseIndexEntry((stat.S_IFREG | 0644, istream.binsha, 0, path))
index = git.IndexFile.from_tree(repo, repo.heads['master'])
index.add([entry])
index.commit(commit_message)

非ベアリポジトリでは、これは期待どおりに機能します。私はファイルシステムに明示的に触れているのではなく、Gitのオブジェクトデータベースだけに触れていることに注意してください。

ただし、ベアリポジトリでは、これは機能しません。IndexFile.add関数はgit_working_dirデコレータで装飾されています。

@git_working_dir
def add(self, items, force=True, fprogress=lambda *args: None, path_rewriter=None, 
            write=True):
    """Add files from the working tree, specific blobs or BaseIndexEntries
    to the index. 

working_tree_dirこのデコレータは、パス参照を正しく解決できるように、リポジトリにchdirしようとします。ただし、working_tree_dirベアリポジトリには無効であり、を発生させますAssertionError

このデコレータがなぜここにあるのか誰かが知っていますか?パスを解決するためだけですか、それともベアリポジトリにインデックスを作成することは不可能ですか?これはGitPythonのバグですか、それともGitの私の理解のバグですか?


編集:同様に、IndexFile.remove関数は(default_indexデコレータを介して)デフォルトのインデックスであることを表明します。ベアリポジトリには確かにデフォルトのインデックスがありませんが、インデックスオブジェクトをまったく持つことはできませんか?

@post_clear_cache
@default_index
def remove(self, items, working_tree=False, **kwargs):
    """Remove the given items from the index and optionally from
    the working tree as well.
4

2 に答える 2

0

APIリファレンスから:

git.index.util.git_working_dir(func)

相対パスが正しく処理されることを保証するために、現在の作業ディレクトリをgitリポジトリの1つに変更するデコレータ

Bare Gitリポジトリには作業ディレクトリがないため、add関数はこれでハングアップしています。

ただし、裸のGitリポジトリにもインデックスがありません[1]

于 2010-09-02T19:06:13.750 に答える
0

機能を詳しく調べてみると、IndexFile.add必要な機能はごくわずかであることがわかりました。実際、add呼び出しをこれらの2行に置き換えるだけで、次のトリックが実行されます。

index.entries[index.entry_key(entry)] = git.IndexEntry.from_base(entry)
index.write()

私はまだこれが良い考えかどうか疑問に思っていますが...

于 2010-09-02T19:26:58.087 に答える