Nicu Tofan
Nicu Tofan

Reputation: 1154

Deleting a file from git repository using libgit2

Say you have a file in a git repository:

What APIs should be used to create a commit that removes that file? For example in this question the file is committed without creating it on disk. Is it now possible to remove that file without using the index (stage area)?

I was expecting a similar flow, maybe creating a git_tree_entry for the tree builder, but that does not seem to be the case. git_reference_list() does not list files, so there's a dead end. Also searching the sources for delete and remove got me no success.

Upvotes: 5

Views: 1236

Answers (2)

Nicu Tofan
Nicu Tofan

Reputation: 1154

Here is a copy-paste example; for getLastCommit() see this question.

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

Upvotes: 0

Edward Thomson
Edward Thomson

Reputation: 78893

Removing a file is similar to adding a file - you remove the index entry to stage the delete, then you can create a commit from the index.

You probably want to use git_index_remove_bypath, which will remove the file from the index and resolve any conflicts that file had.

Upvotes: 5

Related Questions