0

这对我使用 pygit2 来说很好:

  1. 克隆 repo 的 master 分支
  2. 创建一个分支
  3. 做一些改变
  4. 将分支推送到原点

这对我来说失败了:

  1. 克隆 repo 的 master 分支
  2. 签出现有分支

我总是以分离的头结束。有没有什么技巧可以在不分离 HEAD 的情况下进行结帐?我现在已经花了一天多的时间,我知道必须有一种方法可以正确地做到这一点,但我在网上看到的每个例子都是我在下面做的......

这是我的精简测试用例,每次尝试的每个分支都失败:

repo = pygit2.clone_repository(url,dir,bare=False,checkout_branch="master",callbacks=RemoteCallbacks())
checkout_branch = repo.branches["origin/{0}".format(branch))
ref = repo.lookup_reference(checkout_branch.name)
repo.checkout(ref)
4

2 回答 2

0

我想我已经通过在运行结帐之前添加以下位来解决这个问题。这假设您要签出远程已经存在的分支:

if not checkout_branch in repo.branches.local:
    remote_branch = "origin/" + checkout_branch
    if not remote_branch in repo.branches.remote:
        # handle a fatal error here
        pass
    (commit, reference) = repo.resolve_refish(remote_branch)
    repo.create_reference("refs/heads/" + checkout_branch,commit.hex)
于 2021-07-19T21:23:17.633 回答
0

虽然 pygit2 可能会带来额外的麻烦,但请从以下事实开始:当您克隆存储库时,您首先会获得所有其他 Git 的提交,而不是它的任何分支 然后,就在命令行git clone命令向您返回提示之前,它会根据您提供的参数为您创建一个分支。-b如果您没有提供-b参数,它(您自己的 Git)会询问另一个Git他们推荐的分支名称,并根据该名称创建一个分支。

结果是,如果他们他们的Git 中有分支branch1branch2branch3mainxyzzy,并且您指定-b main或不指定任何内容并且他们推荐他们的main,那么您的 Git 现在在您的存储库中只有一个分支 - 您的存储库的克隆 -这就是名为. 您的 Git 将其创建为您的; 这不是他们的。他们的分支名称是他们的main main main

如果您想要将分支命名为fred, barney, betty, 而wilma不是它们的名称,您可以这样做。为了防止您git clone创建任何分支,您可以在命令中添加-n选项git clone:现在您获得了他们的所有提交,并且根本没有分支,现在您可以选择一个与他们的任何名称都不匹配的名称。

但是:他们的分支名称会发生​​什么变化?答案是:你的 Git 使用它们的分支名称,例如branch1andbranch2等等main,并将它们更改为远程跟踪名称。您的 Git 在此处使用的远程跟踪名称是origin/branch1origin/branch2origin/main等。

这些远程跟踪名称与它们的分支名称相匹配,并带有明显的替换。但它们不是分支名称。它们是远程跟踪名称。有什么不同?你看到的就是那个超然的 HEAD 。使用远程跟踪名称意味着我不打算进行任何新的提交。使用分支名称意味着我确实打算进行新的提交。如果您打算进行新的提交,您应该使用分支名称,而不是远程跟踪名称。

一般来说,这可能意味着您必须要求您的 Git在您自己的本地存储库中创建一个新的分支名称。你是怎样做的?好吧,在复杂的设置中这一切都变得有点复杂,但我们从这个开始:检查分支名称X的请求,对于任何X ,如果没有名为X的分支,则无法继续......所以如果你的 Git 有还没有X ,你的 Git 首先检查你是否有,如果有,你的 Git 会的. origin/Xorigin/X Git 将此称为“DWIM 模式”,意思是“按我的意思行事(不是我所说的)”。该git checkout命令有一个新标志--no-guess, 来禁用这种猜测你的意思。使用:

git checkout --no-guess branch1

origin/branch1在抱怨没有branch1退房之前不会看你是否有一个。默认是先检查:没有branch1? 检查origin/branch1,如果是,使用创建 ,同样的方式从你的创建你的,你从他们的 Git 获得的。branch1 origin/branch1git clone mainorigin/mainmain

这有点迂回,但大多数时候它对大多数用户来说效果很好。只要他们不跑git checkout origin/branch1,就是这样。

于 2021-07-19T15:08:33.563 回答