我在 C# 解决方案中使用 libgit2sharp 切换到分支并提取最新更改。这是我正在使用的代码:
public void FetchAll()
{
using (var repo = new Repository(_LocalGitPath))
{
foreach (Remote remote in repo.Network.Remotes)
{
FetchOptions options = new FetchOptions();
options.CredentialsProvider = new CredentialsHandler((url, usernameFromUrl, types) => new UsernamePasswordCredentials()
{
Username = _UserName,
Password = _Password
});
repo.Network.Fetch(remote, options);
}
}
}
public string CheckoutBranch(string branchName)
{
using (var repo = new Repository(_LocalGitPath))
{
var trackingBranch = repo.Branches[branchName];
if (trackingBranch.IsRemote)
{
branchName = branchName.Replace("origin/", string.Empty);
var branch = repo.CreateBranch(branchName, trackingBranch.Tip);
repo.Branches.Update(branch, b => b.TrackedBranch = trackingBranch.CanonicalName);
Commands.Checkout(repo, branch, new CheckoutOptions { CheckoutModifiers = CheckoutModifiers.Force });
}
else
{
Commands.Checkout(repo, trackingBranch, new CheckoutOptions { CheckoutModifiers = CheckoutModifiers.Force });
}
return branchName;
}
}
public void PullBranch(string branchName)
{
using (var repo = new Repository(_LocalGitPath))
{
PullOptions options = new PullOptions();
options.MergeOptions = new MergeOptions();
options.MergeOptions.FailOnConflict = true;
options.FetchOptions = new FetchOptions();
options.FetchOptions.CredentialsProvider = new CredentialsHandler((url, usernameFromUrl, types) => new UsernamePasswordCredentials()
{
Username = _UserName,
Password = _Password
});
repo.Network.Pull(new Signature(_UserName, _Password, new DateTimeOffset(DateTime.Now)), options);
}
}
我在获取和检查分支时没有任何问题。当我尝试拉取最新版本时,收到一条错误消息:“当前分支没有跟踪信息。”我相信这意味着本地分支不知道从哪个正确的远程存储库中提取更改,但我无法弄清楚如何告诉 libgit2sharp 远程存储库路径是什么。有人有什么建议吗?
在研究这个问题时我发现:https://github.com/libgit2/libgit2sharp/issues/1235 https://github.com/libgit2/libgit2sharp/issues/1235。本质上,libgit2sharp 开发人员描述了我所看到的确切问题,但没有提供任何修复代码。
另请注意:我永远不会从该存储库合并或推送任何更改。我将其拉出以进行自动构建,因此我们可以忽略或覆盖任何本地更改。我只需要获取最新的代码。
解决方案:
我已经用我正在使用的解决方案更新了上面的代码。您需要非常小心,以确保在签出分支时,检查要签出的分支上的 isRemote 标志是否设置为 true。如果您签出不是远程的分支,它会将远程设置为“。”在你的 git 配置文件中,你需要手动修复它。如果没有有效的遥控器,您将无法提取分支更改。
不要使用 libgit2sharp wiki 上的代码示例,除非他们添加了此检查。