Удаление файла из репозитория git с использованием libgit2

Допустим, у вас есть файл в репозитории git:

  • a.txt

Какие API следует использовать для создания коммита, который удаляет этот файл?
Например в этот вопрос файл фиксируется без создания его на диске. Теперь можно удалить этот файл без использования индекса (области рабочей области)?

Я ожидал подобного потока, возможно, создавая git_tree_entry для строителя деревьев, но это не так. git_reference_list() не перечисляет файлы, так что тупик есть. Также поиск источников для удаления и удаления не принес мне успеха.

5

Решение

Удаление файла аналогично добавлению файла — вы удаляете запись индекса, чтобы выполнить этап удаления, затем вы можете создать коммит из индекса.

Вы, вероятно, хотите использовать git_index_remove_bypath, который удалит файл из индекса а также разрешите любые конфликты, которые имел файл.

4

Другие решения

Вот пример копирования-вставки; за getLastCommit() увидеть этот вопрос.

bool commitStage (
git_repository * repo, git_signature * sign,
const char * message )
{
bool b = false;
int rc;
git_index * repo_idx;   /* the stage area for our repository */
git_oid oid_idx_tree;   /* the SHA1 for the tree generated from index */
git_oid oid_commit;     /* the SHA1 for our commit */
git_tree * tree_cmt;    /* tree generated from index */
git_commit * parent_commit;/* most recent commit in the head */

parent_commit = getLastCommit( repo );
if ( parent_commit != NULL )
{ /* we have the parent commit */
rc = git_repository_index( &repo_idx, repo );
if ( rc == 0 )
{ /* we now have the index (stage area) structure in repo_idx */
git_index_read(repo_idx);
/* the stage area may be altered here with functions like
git_index_add_bypath();
git_index_remove_bypath();
*/

/* by writing the index we get the SHA1 of the tree */
rc = git_index_write_tree( &oid_idx_tree, repo_idx );
if ( rc == 0 )
{
rc = git_tree_lookup(
&tree_cmt, repo, &oid_idx_tree );
if ( rc == 0 )
{ /* the actual tree structure; create a commit from it */
rc = git_commit_create(
&oid_commit, repo, "HEAD",
sign, sign, NULL,
message,
tree_cmt, 1, (const git_commit**)&parent_commit );
if ( rc == 0 )
{
b = true;
}
}
}
git_index_free( repo_idx );
}
git_commit_free( parent_commit );
}
return b;
}
0

По вопросам рекламы [email protected]