LibGitSharp:检出远程分支

8

我尝试通过LibGitSharp检出远程分支。 在git本身中,您使用以下命令:

git fetch origin
git checkout -b test origin/test

在较新的版本中,只需要:

git fetch
git checkout test

所以我尝试了这段代码:

repo.Fetch("origin");
repo.Checkout("origin/" + Name);

Fetch和Checkout运行正常,但没有Remote分支的副本。

是否有人有其他方法来检出远程分支呢?

我的替代方案是在仓库中创建该分支并将其推送到远程:

Branch newBranch = repo.Branches.Add(Name, repo.Branches["master"].Commits.First());
repo.Network.Push(newBranch);

但我遇到了这个异常:

您正在尝试推送的分支'Test1'("refs/heads/Test1")没有跟踪上游分支。

也许我可以将该分支设置为上游分支,但我不知道如何操作。

编辑:我没有正确解释清楚,在我的程序中,我尝试更好地描述Fetch和Checkout的作用。Fetch命令已正确执行。现在,如果我使用checkout命令,它应该创建一个远程分支的本地分支,但它没有这样做。我还尝试过repo.Checkout(name),没有使用"origin/",但它会抛出一个异常:No valid git object identified by '...' exists in the repository.


"没有RemoteBranch的副本。" -> 请问您能否更新问题,进一步解释您所期望的“RemoteBranch的副本”具体指什么? - nulltoken
“Fetch和Checkout运行没有任何问题” -> 因此,工作目录已正确更新为由远程跟踪分支指向的提交内容? - nulltoken
1个回答

31
如果我正确理解您的问题,您希望创建一个本地分支,该分支将被配置为跟踪已获取的远程跟踪分支。
换句话说,一旦您获取了存储库,您的引用包含远程跟踪分支(例如origin/theBranch),您想创建一个具有相同名称的本地分支(例如theBranch)。
以下示例应说明如何执行此操作。
const string localBranchName = "theBranch";

// The local branch doesn't exist yet
Assert.Null(repo.Branches[localBranchName]);

// Let's get a reference on the remote tracking branch...
const string trackedBranchName = "origin/theBranch";
Branch trackedBranch = repo.Branches[trackedBranchName];

// ...and create a local branch pointing at the same Commit
Branch branch = repo.CreateBranch(localBranchName, trackedBranch.Tip);

// The local branch is not configured to track anything
Assert.False(branch.IsTracking);

// So, let's configure the local branch to track the remote one.
Branch updatedBranch = repo.Branches.Update(branch,
    b => b.TrackedBranch = trackedBranch.CanonicalName);

// Bam! It's done.
Assert.True(updatedBranch.IsTracking);
Assert.Equal(trackedBranchName, updatedBranch.TrackedBranch.Name);

注意:更多示例可以在BranchFixture.cs测试套件中找到。


1
这个答案有帮助吗?如果我误解了你的问题,我很乐意进行更新。 - nulltoken
是的,那真的很好。我之前没有注意到repo.Branches中的Updatefunction。 :-) - user3541236
最后一行代码中的 TrackedBranch.Name 无法编译通过。Name 属性不存在。也许应该使用 TrackedBranch.CanonicalName?其他可用属性包括 FriendlyName、RemoteName 和 UpstreamBranchCanonicalName。 - Triynko
刚刚试用了一下,对我也有用。谢谢。 - Rogério Silva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接