如何在不需要提供用户详细信息的情况下从特定远程分支获取最新信息



要求:

使用libgit2sharp,我想从特定的git远程分支拉取(fetch+merge)最新到我的当前签出的本地分支

详细信息:

我想从C#自动化某些Git操作。我可以简单地通过调用git.exe(如果我知道路径的话)来做我想做的事情,比如git.exe --git-dir=my-repo-directory pull origin my-remote-branch。请注意,这里我必须提供的唯一外部参数是my-repo-directorymy-remote-branch。Git可以正确处理所有内容,比如名称、密码、电子邮件、当前工作分支(即使它没有远程连接),Git pull也能正常工作。我不需要手动传递任何这些参数。我假设Git从repo的当前Git设置中获取它们(从%HOME%文件夹?)。

有没有一种方法可以在LibGit2Sharp中模拟这种情况?

我尝试过的:

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

它失败了,因为它说there is no tracking branch。我不一定需要一个跟踪远程分支。我只想从一个特定的随机远程回购中获取最新信息,并在可能的情况下执行自动合并。

只是想看看它是否有效,我试过了:

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

失败

请求失败,状态代码:401

其他信息:

我不想直接调用git.exe,因为我无法硬编码git.exe路径。此外,由于我无法在运行时传递用户名、电子邮件等,有没有一种方法可以让libgit2sharp从存储库设置中自行获取它们,就像git.exe一样?

我假设Git从repo的当前Git设置中获取它们(从%HOME%文件夹?)。

这完全取决于远程"原点"是什么:

  • ssh URL(在这种情况下,Git将依赖于%HOME%.ssh)。ssh对libgit2sharp的支持之后是问题7和(被拒绝的)PR 1072:您可能必须使用leobuskin/libgit2sharp-ssh
  • https URL(在这种情况下,Git应该依赖于Git凭据助手(请参阅Git存储),而libgit2不直接支持它,如这里所述
    您必须在CSharp中自己编写帮助程序代码:"使用C#从Windows凭据存储中检索凭据">
    或者,正如Edward Thomson所评论的:

    git pull origin my-remote-branch1中传递一个CredentialsHandler
    根据需要从处理程序返回UsernamePasswordCredentialsDefaultCredentials

请参阅此处以获取UsernamePasswordCredentials示例
另请参阅LibGit2Sharp.Tests/TestHelpers/Constants.cs和其他事件。


关于拉操作,它涉及一个命令Fetch,该命令涉及一个refspec。与"具有refspec差异的Git pull/fetch"一样,您可以为pull传递source:destination分支名称(即使没有跟踪信息)。

这就是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);

最新更新