我有一个带有主和branch1的git回购。在Branch1-我在两个位置克隆,我必须将其重置为一个以前的提交,然后将其强制将其推到远程并将其拿到另一个位置并重置。我必须在一些带有子过程的Python脚本中进行。因为我能够重置位置1并将强制推向远程,但是我无法将其在https url中的访问令牌中获取2。如果我可以直接给出凭据,它可以正常工作,但不能使用访问令牌URL。
尝试:git fetch https://<access-token>@repo-url :origin/branch1
输出
- 分支头 -> fetch_head
但是Origin/Branch1没有进入远程头部存在的提交,因此我无法重置该特定的提交。而:
git fetch
prompt - username <entered>
prompt - password <entered>
使原点/分支1到我想要的位置,然后我可以重置。
我希望某种方法运行git fetch
命令(可以包括凭据或访问权限(并在Branch1上获取远程更改,以便我可以将其重置。当我从Python子过程中跑步时,我无法为提示提供凭据。
git fetch https://<access-token>@repo-url :origin/branch1
git fetch
的论点是:
- 遥控器的名称...或者,如果您要固执,您 can 在这里使用原始URL而不是遥控器的名称,这就是您的名字完成;
- 任意数量的 refspecs 。您使用了一个RefSpec,特别是
:origin/branch1
。
refspecs具有src:dst
的一般形式,其中 src
零件是参考的名称 - e.g。,分支或标签名称 - source reposority,infund offund source repository,和 dst
是您自己的存储库中找到的名称。(这可以由Force-Flag +
进行前缀。(在这种情况下,您省略了 仅提供目的地。由于您使用的是git fetch
,因此另一个git是源。因此,在这里,您尚未在源存储库中提供分支的名称和git fetch
不会尝试猜测。
如果您想将其branch1
用作origin/branch1
的来源,请提供正确的RefSpec。使用 full 参考名称也是明智的:
git fetch <url> refs/heads/branch1:refs/remotes/origin/branch1
例如。
使用远程名称而不是URL的标准获取从remote.name.fetch
设置获得默认的RefSpec。对于一个名为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')
您现在可以在git fetch
参数中添加refspecs
(字符串列表(。
另外,如果您经常这样做,则可以添加一个具有所需访问令牌的遥控器。请注意,即使新遥控器被命名为origin
以外的其他内容,您也可以将替代遥控器的提取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进行此更新。