"Git log -1 fullpath / myfile" con libgit2

Quiero implementar git log -1 fullpath/myfile myfile con libgit2. Soy bastante nuevo en libgit2. ¿Estoy en el path correcto? Esto es lo que tengo hasta ahora:

 git_repository_head(&refToHead, repo); headOID = git_reference_oid(refToHead); git_commit_lookup(&headCommit, repo, headOID); headTreeOID = git_commit_tree_oid(headCommit); git_tree_lookup(&tree, repo, headTreeOID); git_tree_entry_byname(tree, "repopath/myfile"); 

Lamentablemente, git_tree_entry_byname parece no funcionar para files en subdirectorys del repository. ¿Alguna idea?

Gracias, Lars

Lamentablemente, git_tree_entry_byname parece no funcionar para files en subdirectorys del repository.

git_tree_entry_byname solo funciona contra las inputs (treees, blobs y, cuando se admiten, submodules) que están inmediatamente debajo del tree pasado.

Una solución simple a su pregunta sería confiar en git_tree_get_subtree (ver testings ) para recuperar el subtree más profundo contenido en un tree, dada su ruta relativa. Esto funcionaría sin importar cuán profunda sea la input en la estructura del tree.

Por lo tanto, tendrías que llamar a git_tree_git_subtree para recuperar el tree padre de la input que estás buscando, luego invocar get_tree_entry_byname pasándolo al tree padre.

Quiero implementar git log -1 fullpath / myfile con libgit2

Si está dispuesto a recuperar qué compromiso finalmente actualizó un file, le recomendamos que consulte esta respuesta, que brinda algunos consejos generales sobre el tema y las advertencias del historial de files.

No puedo encontrar ninguna pista para get la confirmación en su respuesta vinculada.

Tendrás que aprovechar la API de revision walking .

  • La descripción de la característica se puede encontrar aquí .
  • Una testing que demuestre diferentes estrategias para caminar también puede brindarle alguna ayuda

Básicamente, tendrías que averiguar desde HEAD el oid de la input del tree que coincida con tu filename . Una vez hecho esto, deberá caminar de forma recursiva a los padres del compromiso HEAD y, para cada tree de compromiso, intente identificar uno de los dos cambios siguientes.

  • Detecta si el file ha sido renombrado (la input del tree ha desaparecido de su tree padre, un nuevo file con el mismo oid aparecido debajo del tree padre)
  • Detecta si el contenido del file ha cambiado (la input del tree todavía existe con su nombre pero su oid ha cambiado).

Salga del asa de bucle pronto cuando detecte uno o cuando ya no se comprometa a procesar.