¿Cómo extraer lo último de una twig remota específica sin tener que proporcionar detalles del usuario?

Requisito:

Usando libgit2sharp quiero extraer (search + fusionar) lo último de una twig remota de git específica a mi twig local actualmente desprotegida , sin tener que pasar ningún otro argumento, como cnetworkingenciales de usuario, etc. Básicamente estoy tratando de replicar el git pull origin my-remote-branch

Detalles:

Quiero automatizar ciertas operaciones de Git desde C #. Simplemente puedo hacer lo que quiero al invocar git.exe (si conozco la ruta), como git.exe --git-dir=my-repo-directory pull origin my-remote-branch . Tenga en count que aquí los únicos parameters externos que debo proporcionar son my-repo-directory y my-remote-branch . Git lo hace todo bien, como el nombre, la contraseña, el correo electrónico, la twig de trabajo actual (incluso si no tiene connection remota) y git pull simplemente funciona. No tengo que pasar ninguno de esos parameters de forma manual. Supongo que Git los obtiene de la configuration actual de Git para el repository (desde la carpeta% HOME%?).

¿Hay alguna manera de simular eso en LibGit2Sharp?

Lo que probé:

 using (var repo = new Repository("my-repo-directory")) { PullOptions pullOptions = new PullOptions() { MergeOptions = new MergeOptions() { FastForwardStrategy = FastForwardStrategy.Default } }; MergeResult mergeResult = Commands.Pull( repo, new Signature("my name", "my email", DateTimeOffset.Now), // I dont want to provide these pullOptions ); } 

Lo cual falla, ya que dice que there is no tracking branch . No necesito necesariamente una twig remota de rastreo. Solo quiero search lo último de un repository remoto aleatorio específico y realizar la automation si es posible.

Solo para ver si funciona intenté:

 using (var repo = new Repository("my-repo-directory")) { var trackingBranch = repo.Branches["remotes/origin/my-remote-branch"]; if (trackingBranch.IsRemote) // even though I dont want to set tracking branch like this { var branch = repo.Head; repo.Branches.Update(branch, b => b.TrackedBranch = trackingBranch.CanonicalName); } PullOptions pullOptions = new PullOptions() { MergeOptions = new MergeOptions() { FastForwardStrategy = FastForwardStrategy.Default } }; MergeResult mergeResult = Commands.Pull( repo, new Signature("my name", "my email", DateTimeOffset.Now), pullOptions ); } 

Esto falla con

request fallida con código de estado: 401

Información adicional:

No quiero invocar git.exe directamente porque no puedo codificar la ruta de acceso de git exe. Además, dado que no puedo pasar el nombre de usuario, el correo electrónico, etc. en el time de ejecución, ¿hay alguna forma de que libgit2sharp los obtenga por sí mismo desde la configuration del repository, como lo hace git.exe?

Supongo que Git los obtiene de la configuration actual de Git para el repository (desde la carpeta %HOME% ?).

Depende completamente de lo que sea el "origen" remoto:

  • una URL ssh (en cuyo caso Git confiará en %HOME%\.ssh ). El soporte ssh para libgit2sharp va seguido del número 7 y (rechazado) PR 1072 : es posible que tenga que usar leobuskin/libgit2sharp-ssh
  • una URL https (en cuyo caso Git debe confiar en un asistente de cnetworkingenciales de Git (ver Almacenamiento de Git ), que no es compatible directamente con libgit2 , como se menciona aquí .
    Deberá codificar ese asistente en CSharp: " Recuperar cnetworkingenciales del almacén de cnetworkingenciales de Windows usando C # ".
    O, como comentó Edward Thomson :

    Pase un CnetworkingentialsHandler en sus FetchOptions .
    Devuelva UsernamePasswordCnetworkingentials o DefaultCnetworkingentials de su controller, según corresponda.

Vea aquí un ejemplo de UsernamePasswordCnetworkingentials PasswordDirectory.
Ver también LibGit2Sharp.Tests/TestHelpers/Constants.cs y otras ocurrencias .


Con respecto a la operación de extracción, se trata de una Fetch commands , que implica un refspec . Al igual que en " Git pull / fetch with refspec differences ", puede pasar los nombres de la twig de source:destination para su extracción (incluso si no hay información de seguimiento).

Eso es lo que se usa en LibGit2Sharp.Tests/FetchFixture.cs .

 string refSpec = string.Format("refs/heads/{2}:refs/remotes/{0}/{1}", remoteName, localBranchName, remoteBranchName); Commands.Fetch(repo, remoteName, new string[] { refSpec }, new FetchOptions { TagFetchMode = TagFetchMode.None, OnUpdateTips = expectedFetchState.RemoteUpdateTipsHandler }, null);