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

时间:2017-10-19 15:30:23

标签: c# git git-pull pull libgit2sharp

要求:

使用libgit2sharp我想从特定git远程分支拉取(获取+合并)到我的当前检出的本地分支,而不必传递任何其他参数,如用户凭据等。基本上我试图复制git pull origin my-remote-branch

详细信息:

我想从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,因此失败了。我不一定需要跟踪远程分支。我只想从特定的随机远程仓库中获取最新信息并尽可能执行automerge。

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

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一样?

1 个答案:

答案 0 :(得分:4)

  

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

这完全取决于遥控器的起源"是:

See here代表UsernamePasswordCredentials示例 另请参阅LibGit2Sharp.Tests/TestHelpers/Constants.csother occurrences

关于拉取操作,它涉及Command Fetch,其中涉及 refspec 。与在" Git pull/fetch with refspec differences"中一样,您可以传递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);