将已跟踪的文件添加到索引中

时间:2017-08-16 21:13:33

标签: libgit2

在git中它将是

var form = document.querySelector('#form');
var inject = doucment.querySelector('#injection-point');
for ( var i = 0; i < 7; i++ ) {
  var cln = form.cloneNode(true);
  cln.setAttribute('id', 'form-' + i);
  inject.appendChild(cln);
}

我可以轻松地在libgit2中做到这一点。 但是,如果我修改a.txt并想将它添加到索引,我会这样做 1. create file a.txt 2. commit file a.txt 3. a.txt is tracked

不幸的是我无法用libgit2来模仿它。我几乎尝试了互联网提供的一切,但没有任何效果。所以我觉得我错过了一些基本的东西。请注意,我可以添加未跟踪索引的新文件,没有问题,只有我找不到添加它们的方法。

这是我的代码。

git add a.txt

修改

在Ed的帖子之后,我更新了我的代码,但它仍然只添加了未跟踪的新文件。

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);
}

1 个答案:

答案 0 :(得分:1)

您的git_index_get_bypath会为您提供当前存在的索引条目。然后,您memcpy entry索引中的git_index_add,然后mode回来。你实际上并没有更改条目。

(即,除非索引条目当前是可执行的。在这种情况下,您要通过将GIT_FILEMODE_BLOB设置为git_index_add来删除执行位。)

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

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