裸存储库可以有索引吗?这是一个错误吗?

时间:2010-09-02 18:46:17

标签: git gitpython

我正在尝试让GitPython 0.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. 

此装饰器尝试将chdir添加到repo的working_tree_dir,以便可以正确解析路径引用。但是,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.

2 个答案:

答案 0 :(得分:0)

来自API reference

  

git.index.util.git_working_dir(FUNC)

     

装饰器将当前工作目录更改为git存储库之一,以确保正确处理相对路径

Bare Git存储库没有工作目录,因此add函数已挂起。

但是,裸Git仓库也没有索引[1]

答案 1 :(得分:0)

仔细检查IndexFile.add功能后,我意识到我只需要很少的功能。实际上,只需用这两行替换add调用即可:

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

我仍然想知道这是不是一个好主意,但是......