我有一个与主人和branch1的git回购。在分支1-我克隆在两个位置,我必须重置它到一个以前的提交在一个位置,然后强制将它推到远程,获取到另一个位置,并重置它。我必须在带有子进程的python脚本中这样做。因为我能够在location1中重置并强制推到远程,但是我无法使用https URL中的访问令牌在location2中获取它。如果我可以直接提供凭据,那么它可以正常工作,但不能使用访问令牌URL。
尝试:输出的git fetch https://<access-token>@repo-url :origin/branch1
但是原产地/分支1没有到远程头所在的提交,因此我无法重置该特定提交。同时:
git fetch
prompt - username <entered>
prompt - password <entered>使原产地/分支1到我想要的提交位置,然后我能够重置到它。
我希望有某种方式运行git fetch命令(可以包括凭据或访问令牌),并在branch1上获取远程更改,以便我可以重置它。由于我是从python子进程运行的,所以无法为提示提供凭据。
发布于 2019-07-31 16:17:11
git fetch https://<access-token>@repo-url :origin/branch1
git fetch的论点是:
:origin/branch1。刷新规范有一种通用的src:dst,形式,其中src部件是在源存储库中找到的引用的名称(例如分支或标记名称),而dst是在您自己的存储库中找到的名称。(这可能是以强制标志+为前缀的。)在这种情况下,您省略了源,只提供了一个目标。由于您使用的是git fetch,所以另一个Git是源。因此,在这里,--您没有在源存储库中提供分支的名称--和git fetch不会尝试猜测。
如果您希望使用它们的branch1作为您的origin/branch1的源,请提供正确的参考规范。使用完整的引用名称也是明智的:
git fetch <url> refs/heads/branch1:refs/remotes/origin/branch1例如。
标准的fetch使用远程名称而不是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')现在可以将refspecs (字符串列表)添加到git fetch参数中。
或者,如果您必须经常这样做,您可以只添加一个具有所需访问令牌的远程设备。请注意,您可以配置替代遥控器的fetch fetch来覆盖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的嵌入式令牌来进行更新。
https://stackoverflow.com/questions/57290884
复制相似问题