2017-08-16 101 views
0

这将是添加已经跟踪文件中git的指数

1. create file a.txt 
2. commit file a.txt 
3. a.txt is tracked 

我能做到这一点的libgit2容易。 但是,如果我修改A.TXT,并希望将其添加到索引我会做 git add a.txt

可惜我不能效仿与libgit2。我几乎尝试了互联网提供的一切,但没有任何工作。所以我觉得我错过了一些基本的东西。请注意,我可以添加没有跟踪索引而没有问题的新文件,只有我找不到添加它们的方式。

这是我的代码。

void add_file(char *file) 
{ 
    git_index *index; 
    int error; 
    const git_index_entry *entry; 
    git_index_entry new_entry; 

    error = git_repository_index(&index, m_repo); 
    entry = git_index_get_bypath(index,file, 0); 
    if(entry) 
    { 
     memcpy(&new_entry, entry, sizeof(git_index_entry)); 
     new_entry.path = file; 
     new_entry.mode = GIT_FILEMODE_BLOB; 
     error = git_index_add(index, &entry); 
    } 
    else 
     error = git_index_add_bypath(index, file); 

    error = git_index_write(index); 
    git_index_free(index); 
} 

编辑:

埃德的帖子后,我更新我的代码,但它仍然是添加了不跟踪唯一的新文件。

git_index *index; 
git_oid tree; 
int error; 

error = git_repository_index(&index, m_repo); 
error = git_index_add_bypath(index, file); 
error = git_index_write(index); 
error = git_index_write_tree(&tree, index); 

git_index_free(index); 

回答

1

您的git_index_get_bypath为您提供当前存在的索引条目。然后你的entry在索引git_index_add右后方。你实际上并不是更改的条目。

(也就是说,除非索引条目当前可执行的。在这种情况下,你是通过设置去除执行位modeGIT_FILEMODE_BLOB。)

你可能不希望在这里使用git_index_add,作为实际上直接编辑索引的低级内容。您需要将文件添加到对象数据库,然后使用生成的OID更新索引。

如果在磁盘上更改了文件,那么只需运行git_index_add_bypath并让libgit2使用磁盘上存在的内容更新索引。

+0

你能解释一下在API调用这方面有点: “你需要将文件与得到的OID添加到对象数据库,然后更新索引” 其API方法我应该叫什么呢? –

+0

没关系,我找到了。它是'git_index_write_tree'。 –

+0

我想我误解了你说的话。你能否解释第三段可能是一个例子(不一定是全部工作)。我想我明白了,但我想我完全误解了。查看更新后的帖子 –

相关问题