使用NGit/JGit将存储库克隆到现有目录中



我正试图将GitHub存储库克隆到一个现有的非空目录中。我试着用git命令行来模仿它的操作方式:

git init
git remote add origin https://github.com/[...].git
git fetch
git reset --hard origin/branch

var git = Git.Init().SetDirectory(Location).Call();
Repository = git.GetRepository();
var config = Repository.GetConfig();
config.SetString("remote", "origin", "url", "https://github.com/[...].git");
config.Save();
git.Fetch().Call();
git.Reset().SetRef("origin/branch")
    .SetMode(ResetCommand.ResetType.HARD).Call();

在这种特殊的情况下,我得到了一个"Nothingtofetch"错误。我尝试了很多不同的方法,包括克隆到临时字典中,使用BranchCreate。。。但我总是在某个地方遇到问题。

那么,您将如何正确地克隆存储库,并将其设置为将来获取更新呢?

虽然克隆比git init .+git remote add origin ...+git fetch+git reset --hard origin/master更容易。,对于非空文件夹,确实需要该序列。

在这种情况下,您需要告诉Git要获取什么,正如OP:所评论的那样

git.Fetch().SetRefSpecs(new RefSpec("+refs/heads/*:refs/remotes/origin/*")).Call();

这将允许git.Fetch().Call();实际获取一些东西。

(这就是NGit.Test/NGit.Api/FetchCommandTest.cs L61-L82正在做的)

经过聊天中的广泛讨论,以下是OP正在使用的代码:

var cloneUrl = ...;
var branchName = ...;
 
var git = Git.Init().SetDirectory(Location).Call();
Repository = git.GetRepository();
 
// Original code in question works, is shorter,
// but this is most likely the "proper" way to do it.
var config = Repository.GetConfig();
RemoteConfig remoteConfig = new RemoteConfig(config, "origin");
remoteConfig.AddURI(new URIish(cloneUrl));
// May use * instead of branch name to fetch all branches.
// Same as config.SetString("remote", "origin", "fetch", ...);
remoteConfig.AddFetchRefSpec(new RefSpec(
    "+refs/heads/" + Settings.Branch +
    ":refs/remotes/origin/" + Settings.Branch));
remoteConfig.Update(config);
config.Save();
 
git.Fetch().Call();
git.BranchCreate().SetName(branchName).SetStartPoint("origin/" + branchName)
    .SetUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK).Call();
git.Checkout().SetName(branchName).Call();
 
// To update the branch:
 
git.Fetch().Call();
git.Reset().SetRef("origin/" + branchName).Call();

相关内容

  • 没有找到相关文章

最新更新