git 获取 https://<access-token>url-to-repo :git-branch 不工作

git fetch https://<access-token>url-to-repo :git-branch not working

我有一个包含 master 和 branch1 的 git 仓库。 在 branch1- 我在两个位置克隆,我必须将它重置为一个位置的前一个提交,然后强制将其推送到远程并将其提取到另一个位置并重置它。我必须在一些带有子进程的 python 脚本中完成。因为我能够在 location1 中重置并强制推送到远程,但我无法使用 https URL 中的访问令牌在 location2 中获取它。如果我可以直接提供凭据,它可以正常工作,但不能使用访问令牌 URL.

尝试过:git fetch https://<access-token>@repo-url :origin/branch1 输出

  • branch HEAD -> FETCH_HEAD

但 origin/branch1 没有转到远程头所在的提交,因此我无法重置该特定提交。 同时:

  git fetch
  prompt - username <entered>
  prompt - password <entered>

使 origin/branch1 提交到我想要的位置,然后我可以重置它。

我希望通过某种方式来执行 运行 git fetch 命令(可以包括凭据或访问令牌)并获取 branch1 上的远程更改,以便我可以重置它。由于我正在 运行ning 来自 python 子流程,因此我无法为提示提供凭据。

git fetch https://<access-token>@repo-url :origin/branch1

git fetch 的参数是:

  • 遥控器的名称...或者,如果您固执己见,您可以可以在此处使用原始 URL 而不是名称一个遥控器,这就是你所做的;
  • 任意数量的 refspecs。您使用了一个 refspec,特别是 :origin/branch1.

Refspecs 的一般形式为 <em>src</em>:<em>dst</em>,其中 src 部分是在 source 存储库中找到的引用的名称,例如分支或标签名称,并且 dst 是在您自己的存储库中找到的名称。 (这可能以强制标志 + 为前缀。)在这种情况下,您 省略了 源并仅提供了目的地。由于您使用的是 git fetch,因此另一个 Git 是来源。所以在这里,你没有提供源存储库中的分支名称并且git fetch不会尝试猜测。

如果您希望使用他们的 branch1 作为您的 origin/branch1 的来源,请提供正确的 refspec。使用 完整 参考名称也是明智的:

git fetch <url> refs/heads/branch1:refs/remotes/origin/branch1

例如。

标准获取,使用远程名称而不是 URL,从 远程获取默认 refspec。<em>name</em>.fetch 设置。对于名为 origin 的遥控器,这通常是:

+refs/heads/*:refs/remotes/origin/*

以便git fetch origin获得所有他们的分支名称(refs/heads/*),并使用它们来强制 更新所有相应的远程跟踪名称(refs/remotes/origin/** 会自动适当填写)。如果您提供原始 URL 而不是远程名称 origin 的原因是您需要插入访问令牌,您可以这样做 提取 remote.origin.fetch 设置。例如:

p = subprocess.run(["git", "config", "--get-all", "remote.origin.fetch"],
    capture_output=True, text=True)
# for python 3.6 or earlier, use
#   stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True

p.check_returncode()
if p.stderr != "":
    ... do something here ...
refspecs = p.stdout.rstrip('\n').split('\n')

您现在可以将 refspecs(字符串列表)添加到您的 git fetch 参数中。


或者,如果您必须经常这样做,您可以只添加一个具有所需访问令牌的遥控器。请注意,即使新遥控器的名称不是 origin,您也可以配置替代遥控器的 fetch refspec 以覆盖 refs/remotes/origin/*。例如:

git remote add tokenized-origin <url-with-token>
git config remote.tokenized-origin.fetch '+refs/heads/*:refs/remotes/origin/*'

然后只是:

git fetch tokenized-origin

每当您想使用 URL-with-embedded-token 进行此更新时。