【问题标题】:git fetch https://<access-token>url-to-repo :git-branch not workinggit fetch https://<access-token>url-to-repo :git-branch 不工作
【发布时间】:2019-12-08 23:31:56
【问题描述】:

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

试过了:git fetch https://&lt;access-token&gt;@repo-url :origin/branch1 哪个输出

  • 分支 HEAD -> FETCH_HEAD

但是 origin/branch1 没有去到远程头所在的提交,所以我无法重置那个特定的提交。 而:

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

将 origin/branch1 设置为我想要的提交,然后我可以重置它。

我希望通过某种方式运行git fetch 命令(可以包括凭据或访问令牌)并获取分支1 上的远程更改,以便我可以重置它。当我从 python 子进程运行时,我无法为提示提供凭据。

【问题讨论】:

  • 你不需要在 git 中获取“在一个分支中”。您只需从远程获取,并且该远程上的所有已知分支都将作为源来更新您的(本地,但不是您的)远程跟踪分支。然后,您可以轻松地合并/rebase/重置所有您想要获得您的本地分支所需状态的所有内容。

标签: git subprocess python-3.7 git-fetch


【解决方案1】:

git fetch https://&lt;access-token&gt;@repo-url :origin/branch1

git fetch 的参数是:

  • 远程的名称...或者,如果您要固执,您可以在此处使用原始 URL 而不是远程的名称,这就是您所拥有的完成;
  • 任意数量的 refspecs。您使用了一个 refspec,特别是 :origin/branch1

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

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

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

例如。

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

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

以便git fetch origin 获得所有他们的分支名称 (refs/heads/*),并使用这些来强制更新所有相应的远程跟踪名称 (@ 987654338@,* 会自动正确填写)。如果您提供原始 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 参数中。


或者,如果您必须经常这样做,您可能只需添加一个遥控器,其中包含所需的访问令牌。请注意,您可以配置替代遥控器的 fetch refspec 以覆盖 refs/remotes/origin/*,即使新遥控器的名称不是 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 进行此更新。

【讨论】:

  • 我投了赞成票,因为您的回答解决了我的问题!我在做git fetch https://user:pass@repo.git/,但没用。尝试git fetch https://user:pass@repo.git/ refs/heads/branch:refs/remotes/origin/branch 有效。
猜你喜欢
  • 2014-02-14
  • 2017-06-02
  • 2020-08-18
  • 2017-06-12
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多