2010-09-02 75 views
0

我试图让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到回购的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. 

回答

0

仔细检查了IndexFile.add函数后,我意识到我只需要很少的功能。事实上,仅仅通过这两条线更换add调用的伎俩:

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

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

+0

我会说这很好。无论如何,如果您要直接在裸回购库中发送这些斑点,则无需“更改”更改。 – anarcat 2015-03-30 19:53:22

0

API reference

git.index.util.git_working_dir(FUNC)

装饰这改变了当前工作目录的git仓库中的所述一个,以保证相对路径被正确处理

Bare Git存储库没有工作目录,所以add有趣正在越来越多地挂在这上面。

但是,裸Git回购也没有索引[1]

+0

它不会有一个默认的* *索引,当然,因为没有HEAD来创建它。但是,我不确定裸露的回购本身不能包含索引对象。 – Thomas 2010-09-02 19:28:40

+0

我*在*这里看到了一个裸回购指数。 – anarcat 2015-03-30 19:53:38