为什么 git fetch 不总是更新本地分支以显示它何时与远程不同步

问题描述

我有一个脚本可以自动执行我们执行的一些大型拉取请求任务。我做的一件事是尝试自动同步我们使用的两个分支。我曾经使用令牌来执行 git fetch,但最近由于一些政策变化而不得不对其进行更改。

所以我现在正在做的是以下。

subprocess.check_call(['git','fetch',f'https://{username}:{password}@{repo_url}'],cwd=repo_path)

但是,我注意到当我的本地分支与远程分支不同步时,这并不总是显示出来。

问题

我的问题是,git fetch 与我使用我的用户名、密码和 repo_url 时有什么不同,这会导致当我使用我的用户名和凭据进行提取时它不会注意到远程更改?我应该做什么不同的?我应该使用什么来保证我的脚本在远程分支不同步时注意到?

更多详情

我试过自己编写 git fetch 脚本,它工作得很好,只是它需要我再次输入我的用户名和密码。

subprocess.check_call(['git','fetch'],cwd=repo_path)

解决方法

对于遇到此问题的任何其他人:

您想做这样的事情,其中​​ master 是您要更新的分支

subprocess.check_call(['git','fetch',f'https://{username}:{password}@{repo_url}','origin',master:refs/remotes/origin/master'],cwd=repo_path)

该问题似乎与 FETCH_HEAD 在运行 git fetch 时并不总是更新有关。因此,当 git fetch 运行时,远程发生的更改并不总是被拉进来。为什么这在手动运行时有效,但在脚本化时无效,这对我来说是个谜。

另请参阅此问题 here 和此问题 one,这让我找到了解决方案。

从我发现的第一个答案中:

// Pulls the remote 'master' branch down to the local 'master' branch
git pull origin master:refs/remotes/origin/master

从第二个答案我能够拉这条线:

作为一个解决方案,如果使用 git fetch remote_name branch_name 只获取这个特定的分支,并且只有那一行会出现在 .git/FETCH_HEAD 的内容中,从而使 FETCH_HEAD 引用始终正确。

#Will only fetch branchone
git fetch origin branchone

将这两者放在一起,我想出了有效的语法。我保证通过明确指定 refspec 来获取显示本地分支何时不同步的更新,这是这部分 master:refs/remotes/origin/master。将 master 替换为您的分支名称,它会始终更新您的本地分支以显示它何时不同步。

第三个参数 f'https://{username}:{password}@{repo_url}' 仅当您想在脚本开头收集用户名和密码并在任何需要它的 git 命令中使用它们时才需要。否则可以省略。