将已跟踪的文件添加到索引
add already tracked file to index
在 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);
}
编辑:
在 Ed 的 post 之后,我更新了我的代码,但它仍然只添加未跟踪的新文件。
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);
您的 git_index_get_bypath
为您提供当前存在的索引条目。然后,您 memcpy
ing 索引中的 entry
并 git_index_add
将其返回。您实际上根本没有更改条目。
(也就是说,除非索引条目当前是可执行的。在这种情况下,您通过将 mode
设置为 GIT_FILEMODE_BLOB
来删除执行位。)
您可能不想在这里使用 git_index_add
,因为它实际上直接编辑了索引的低级内容。您需要将文件添加到对象数据库,然后使用生成的 OID 更新索引。
如果文件在磁盘上发生了变化,那么只需 运行 git_index_add_bypath
并让 libgit2 使用磁盘上存在的内容更新索引。
在 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);
}
编辑:
在 Ed 的 post 之后,我更新了我的代码,但它仍然只添加未跟踪的新文件。
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);
您的 git_index_get_bypath
为您提供当前存在的索引条目。然后,您 memcpy
ing 索引中的 entry
并 git_index_add
将其返回。您实际上根本没有更改条目。
(也就是说,除非索引条目当前是可执行的。在这种情况下,您通过将 mode
设置为 GIT_FILEMODE_BLOB
来删除执行位。)
您可能不想在这里使用 git_index_add
,因为它实际上直接编辑了索引的低级内容。您需要将文件添加到对象数据库,然后使用生成的 OID 更新索引。
如果文件在磁盘上发生了变化,那么只需 运行 git_index_add_bypath
并让 libgit2 使用磁盘上存在的内容更新索引。