【问题标题】:Why does git fetch not always update the local branch to show when it is out of sync with remote为什么 git fetch 并不总是更新本地分支以显示它何时与远程不同步
【发布时间】:2021-06-25 12:12:18
【问题描述】:

我有一个脚本可以自动执行我们执行的一些大型拉取请求任务。我要做的一件事是尝试自动同步我们使用的两个分支。我曾经使用令牌来做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)

【问题讨论】:

  • 你可以试试凭证管理器吗?
  • 我也不想。我们的 IT 部门真的不喜欢存储用户凭据。
  • 你可以使用 ssh 和密钥认证吗?
  • 确切地说,“并不总是有效”是什么意思? git fetch 调用是否失败?它是否成功并更新了 some 远程跟踪名称,但不是 all 远程跟踪名称?它什么都不做吗?如果有的话,它会产生什么输出?由于check_call 确保退出状态为零(否则引发异常),它是在没有异常的情况下结束,还是以异常结束?
  • (理想情况下,你应该包括一个复制器,但如果它是一个私人仓库,那显然是相当困难的!)

标签: python git git-fetch


【解决方案1】:

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

你想做这样的事情,master 是你要更新的分支

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

这个问题似乎与运行 git fetch 时 FETCH_HEAD 并不总是更新有关。因此,远程发生的更改并不总是在运行 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 命令中使用它们时才需要。否则可以省略。

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 2019-09-18
    • 2018-12-21
    • 1970-01-01
    • 2011-07-30
    • 2022-01-05
    • 1970-01-01
    • 2020-11-13
    • 2022-11-19
    相关资源
    最近更新 更多