使用LibGit2Sharp克隆给定分支

时间:2014-12-05 13:10:47

标签: git libgit2sharp

我想使用LibGit2Sharp将给定分支克隆到本地存储库。

 var repoPath = LibGit2Sharp.Repository.Clone("https://something", localpath, cloneOptions);

 using (var repo = new LibGit2Sharp.Repository(repoPath))
 {
     var branches = repo.Branches.GetEnumerator();
 }

使用repo.Branches.GetEnumerator()我可以看到每个远程分支,但是使用Clone命令我只能从GitHub克隆主分支?我怎样才能克隆" testBranch"或者其他的东西?

实际上,默认情况下,Clone()负责本地检索所有分支的所有提交。默认情况下,只有远程HEAD分支(通常为origin/master)获取自动创建的本地分支对应部分,然后签出。

因此,一旦执行了克隆,你所要做的就是从远程分支创建一个本地分支,你想要工作并检查这个新创建的分支。

例如,如果您对分支my-feature-branch感兴趣并且您的遥控器名为origin

Branch remoteBranch = repo.Branches["origin/my-feature-branch"];

Branch newLocalBranch = repo.CreateBranch("my-feature-branch");

// Make the local branch track the upstream one
repo.Branches.Update(newLocalBranch ,
     b => b.TrackedBranch = remoteBranch.CanonicalName);

Branch trackingBranch = repo.Branches["my-feature-branch"];

repo.Checkout(trackingBranch);

FWIW,还有一个待处理的 Pull Request ,允许用户明确指定想要查看的分支。

修改

我根据您的建议更新了我的代码,但仍然无法正常运行。我的本地存储库的内容与trackingBranch不相同,它仍然代表主分支的内容。

var remoteBranch = repo.Branches["origin/" + branchName];

var newLocalBranch = repo.Branches.Add(branchName, commit, true);

repo.Branches.Update(newLocalBranch, 
      b => b.TrackedBranch = remoteBranch.CanonicalName);

var trackingBranch = repo.Branches[branchName];

repo.Checkout(trackingBranch, new LibGit2Sharp.CheckoutOptions(), author);

1 个答案:

答案 0 :(得分:3)

实际上,默认情况下,Clone()负责本地检索所有分支的所有提交。默认情况下,只有远程HEAD分支(通常为origin/master)获取自动创建的本地分支对应部分,然后签出。

因此,一旦执行了克隆,你所要做的就是从远程分支创建一个本地分支,你想要工作并检查这个新创建的分支。

例如,如果您对分支my-feature-branch感兴趣并且您的遥控器名为origin

Branch remoteBranch = repo.Branches["origin/my-feature-branch"];

Branch newLocalBranch = repo.CreateBranch("my-feature-branch", remoteBranch.Tip);

// Make the local branch track the upstream one
repo.Branches.Update(newLocalBranch ,
     b => b.TrackedBranch = remoteBranch.CanonicalName);

Branch trackingBranch = repo.Branches["my-feature-branch"];

repo.Checkout(trackingBranch);

FWIW,还有一个待处理的 Pull Request ,允许用户明确指定想要查看的分支。

更新

Pull请求已合并。克隆()调用成功后检出已知分支现在可以通过以下方式更轻松地完成:

string clonedRepoPath = Repository.Clone(
    url, targetPath,
    new CloneOptions { BranchName = branchName });