使用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-directory
和my-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一样?
答案 0 :(得分:4)
我假设Git从repo的当前Git设置中获取它们(来自
%HOME%
文件夹?)。
这完全取决于遥控器的起源"是:
%HOME%\.ssh
)。对libgit2sharp的ssh支持后跟issue 7和(被拒绝)PR 1072:您可能必须使用leobuskin/libgit2sharp-ssh
在
CredentialsHandler
中传递FetchOptions
根据需要,从处理程序返回UsernamePasswordCredentials
或DefaultCredentials
。
See here代表UsernamePasswordCredentials
示例
另请参阅LibGit2Sharp.Tests/TestHelpers/Constants.cs
和other 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);