libgit: la forma más rápida de recuperar files en un commit

Necesito iterar sobre las confirmaciones de un repository y search los files afectados para cada confirmación. Este es mi cuello de botella de performance enorme actualmente.

Tengo un contenedor de C ++ alnetworkingedor de las funciones de libgit, pero este fragment debe ser lo suficientemente comprensible.

std::vector<std::string> Commit::getAffectedFiles() const { git_tree* tree = nullptr; git_tree* tree2 = nullptr; int error = git_commit_tree(&tree, get()); throw_on_error(error); try { error = git_commit_tree(&tree2, parent(0).get()); } catch (GitException e) { tree2 = nullptr; // probably initial commit } git_diff* diff = nullptr; git_diff_tree_to_tree(&diff, getRepo(), tree2, tree, 0); std::vector<std::string> ret; git_diff_foreach(diff, [](const git_diff_delta* entry, float progress, void* payload) { std::string str = entry->old_file.path; ((std::vector<std::string>*)payload)->push_back(str); return 0; }, nullptr, nullptr, nullptr, &ret); git_tree_free(tree); git_tree_free(tree2); git_diff_free(diff); return ret; } 

Solo puedo esperar que esté haciendo algo fundamentalmente incorrecto aquí.


Por ejemplo

 git log --stat > /dev/null 

es mucho más rápido y proporciona la misma información.


perf reporta la mayor parte del uso en git__strncmp , git_buf_rfind_next y git_tree__parse en order.


Sé que esto es IO pesado, pero no veo una manera fácil de networkingucir esto o ejecutar esto en paralelo.

Eso es equivalente a lo que git hace internamente, aunque git ha tenido más gente buscándolo para el performance y libgit2 no ha tenido casi tanta inversión en eso.

Sin embargo, algunos parches [0] se fusionaron recientemente en la twig master de libgit2, que puede networkingucir hasta un 40% del time de análisis de tree. Te recomiendo que pruebes y veas qué numbers obtienes (los parches también deberían ser fácilmente backportables a versiones anteriores).

También tenga en count que su versión de git probablemente se haya comstackdo en modo de lanzamiento y libgit2 de forma pnetworkingeterminada comstack en modo de debugging, por lo que si no activó el modo de lanzamiento, ejecute cmake con -DCMAKE_BUILD_TYPE=Release . Esto también acelera significativamente estas operaciones de análisis.

[0] Específicamente PR 3508 y commits 0174f2 y fc4364