2017-08-16 3 views
0

in git indizieren würde esAdd bereits aufgespürte Datei

1. create file a.txt 
2. commit file a.txt 
3. a.txt is tracked 

sein, die ich einfach, dass in libgit2 tun kann. jedoch Wenn ich a.txt ändern und wollte es Index hinzufügen will ich tun git add a.txt

Leider kann ich nicht emulieren mit libgit2. Ich habe praktisch alles versucht, was das Internet angeboten hat, aber nichts hat funktioniert. Ich fühle, dass ich etwas Grundlegendes vermisse. Beachten Sie, dass ich neue Dateien hinzufügen kann, die dem Index nicht ohne Probleme nachverfolgt werden, nur kann ich keine Möglichkeit finden, sie hinzuzufügen.

Hier ist der Code, den ich habe.

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

EDIT:

Nach Eds Beitrag habe ich meinen Code aktualisieren, aber es ist das Hinzufügen noch nur neue Dateien, die nicht verfolgt werden.

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

Antwort

1

Ihr git_index_get_bypath gibt Ihnen den Indexeintrag, wie sie derzeit existiert. Sie sind dann memcpy ing der entry, die im Index ist und git_index_add es direkt zurück. Sie sind eigentlich nicht ändern den Eintrag überhaupt.

(Das heißt, es sei denn, der Indexeintrag zur Zeit ausführbar ist. In diesem Fall können Sie die Execute-Bit entfernen möchten, indem Sie die mode zu GIT_FILEMODE_BLOB.)

Sie wollen wahrscheinlich nicht git_index_add hier verwenden, da die bearbeitet den Inhalt des Index auf niedriger Ebene direkt. Sie müssten die Datei zur Objektdatenbank hinzufügen und dann den Index mit der resultierenden OID aktualisieren.

Wenn die Datei auf der Festplatte geändert wird, führen Sie einfach git_index_add_bypath aus und lassen Sie libgit2 den Index mit dem Inhalt aktualisieren, wie sie auf der Festplatte vorhanden sind.

+0

können Sie ein wenig in Bezug auf die API-Aufruf für das erklären: „Sie müssten die Datei in der Objektdatenbank hinzuzufügen und dann den Index mit dem resultierenden OID aktualisieren“ die API-Methoden sollte ich genau nennen? –

+0

Egal, ich habe es gefunden. Es ist 'git_index_write_tree'. –

+0

Ich glaube, ich habe missverstanden, was du gesagt hast. Kannst du den dritten Absatz vielleicht mit einem Beispiel erläutern (; nicht unbedingt voll funktionsfähig)? Ich dachte, ich hätte es verstanden, aber ich glaube, ich habe es völlig falsch verstanden. Siehe aktualisierten Beitrag –

Verwandte Themen