2013-03-29 30 views
5

Diciamo che avete un file in un repository git:eliminazione di un file dal repository git utilizzando libgit2

  • a.txt

Cosa API deve essere utilizzato per creare un commit che rimuove quel file? Ad esempio in this question il file viene eseguito senza la creazione sul disco. È ora possibile rimuovere quel file senza utilizzare l'indice (area dello stage)?

Mi aspettavo un flusso simile, forse creando un git_tree_entry per il generatore di alberi, ma non sembra essere il caso. git_reference_list() non elenca i file, quindi c'è un vicolo cieco. Anche cercare le fonti per eliminare e rimuovere non mi ha dato alcun successo.

risposta

4

La rimozione di un file è simile all'aggiunta di un file: si rimuove la voce di indice per eseguire l'eliminazione, quindi è possibile creare un commit dall'indice.

Probabilmente si desidera utilizzare git_index_remove_bypath, che rimuoverà il file dall'indice e per risolvere eventuali conflitti presenti nel file.

0

Ecco un esempio di copia-incolla; per getLastCommit() vedi 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; 
} 
+0

per favore spiega il -1, altrimenti è invano, davvero. Aiuta chi cerca sottolineando l'errore in modo che possa sistemarlo. –