soft - revertir cambios en un archivo git
¿Cómo recuperar el historial de un archivo? (3)
Pero no parece óptimo para mí ...
Su enfoque es el correcto. Ten en cuenta que tendrás que luchar contra:
- Renombrado simple (mismo hash de objeto, nombre de entrada de árbol diferente)
- El cambio de nombre y la actualización de contenido se producen en el mismo compromiso (hash diferente, nombre de entrada de árbol diferente. Requeriría una función de comparación y análisis de contenido de archivo que no está disponible en libgit2)
- Historial de varios padres (dos ramas que se han fusionado y en las que se ha modificado el mismo archivo de una manera diferente)
Puede haber algún otro enfoque, por ejemplo, buscar directamente en la carpeta .git y obtener la información necesaria allí.
Aunque entender el diseño de la carpeta .git siempre es un tiempo bien empleado, me temo que no te ayudará con este problema específico del historial de archivos.
Nota: esta pregunta está muy cerca de este problema de libgit2sharp: ¿Cómo obtener la última confirmación que afectó a un archivo dado?
Actualizar
La solicitud de #963 agrega esta característica.
Está disponible desde LibGit2Sharp.0.22.0-pre20150415174523
prelanzador del paquete NuGet.
Tengo otro problema con libgit2 y estaré muy agradecido por su ayuda.
Estoy intentando recuperar el historial de archivos, es decir, la lista de confirmaciones donde se cambió este archivo. Y parece ser bastante poco convencional ... Por lo que puedo ver, no hay ninguna función para eso.
El único método que se me ocurre es usar la API de revisión de la marcha para recorrer las revisiones, verificar el objeto del árbol adjunto para confirmar y buscar el archivo dado, si se encuentra, agregar confirmación a mi lista, de lo contrario, continúe con la próxima confirmación.
Pero no parece óptimo para mí ...
Puede haber algún otro enfoque, por ejemplo, buscar directamente en la carpeta .git y obtener la información necesaria allí.
¡Muchas gracias de antemano!
Esto se sigue principalmente en issues/495 de libgit2.
Aunque se implementa en libgit2sharp ( #963 , para el hito 22 ), todavía está "disponible" en libgit2.
El problema se documenta en problemas / 3041: Proporcione la funcionalidad de registro que envuelve la revwalk
.
El enfoque mencionado en la pregunta se utilizó en este ejemplo de libgit2sharp y se puede adaptar a C utilizando libgit2. Sigue siendo la solución actual, en espera de la resolución de 3041.
Si usa C #, esta funcionalidad se ha agregado a LibGit2Sharp
0.22.0 NuGet Package ( #963 ). Puedes hacer lo siguiente:
var fileHistory = repository.Commits.QueryBy(filePathRelativeToRepository);
foreach (var version in fileHistory)
{
// Get further details by inspecting version.Commit
}
En mi extensión Diff All Files VS (que es de código abierto para que pueda ver el código), necesitaba obtener la confirmación previa de un archivo para poder ver qué cambios se realizaron en un archivo en una confirmación determinada. Así es como recuperé la confirmación previa del archivo:
/// <summary>
/// Gets the previous commit of the file.
/// </summary>
/// <param name="repository">The repository.</param>
/// <param name="filePathRelativeToRepository">The file path relative to repository.</param>
/// <param name="commitSha">The commit sha to start the search for the previous version from. If null, the latest commit of the file will be returned.</param>
/// <returns></returns>
private static Commit GetPreviousCommitOfFile(Repository repository, string filePathRelativeToRepository, string commitSha = null)
{
bool versionMatchesGivenVersion = false;
var fileHistory = repository.Commits.QueryBy(filePathRelativeToRepository);
foreach (var version in fileHistory)
{
// If they want the latest commit or we have found the "previous" commit that they were after, return it.
if (string.IsNullOrWhiteSpace(commitSha) || versionMatchesGivenVersion)
return version.Commit;
// If this commit version matches the version specified, we want to return the next commit in the list, as it will be the previous commit.
if (version.Commit.Sha.Equals(commitSha))
versionMatchesGivenVersion = true;
}
return null;
}