使用 LibGit2Sharp 克隆给定分支

Gáb*_*kos 4 git libgit2sharp

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

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

 using (var repo = new LibGit2Sharp.Repository(repoPath))
 {
     var branches = repo.Branches.GetEnumerator();
 }
Run Code Online (Sandbox Code Playgroud)

使用 repo.Branches.GetEnumerator() 我可以看到每个远程分支,但是使用 Clone 命令我只能从 GitHub 克隆 master 分支?我如何克隆“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);
Run Code Online (Sandbox Code Playgroud)

FWIW,有一个待处理的拉取请求,允许用户明确指定希望查看签出的分支。

编辑

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

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);
Run Code Online (Sandbox Code Playgroud)

nul*_*ken 5

实际上,默认情况下,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);
Run Code Online (Sandbox Code Playgroud)

FWIW,有一个待处理的拉取请求,允许用户明确指定希望查看签出的分支。

更新

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

string clonedRepoPath = Repository.Clone(
    url, targetPath,
    new CloneOptions { BranchName = branchName });
Run Code Online (Sandbox Code Playgroud)