首页 > 解决方案 > git push --all --tags:不兼容

问题描述

当我尝试将所有分支和标签推送到远程时,git 会发出以下错误:

# git push origin --all --tags
fatal: --all and --tags are incompatible

但是,这有效:

# git push origin refs/heads refs/tags
Everything up-to-date

问题:

  1. 为什么 git 命名 push-all-branchs--all而不是--branchesor --headsgit push origin --all只推送分支,而不是所有参考。这种命名背后的哲学是什么?这是否意味着标签真的是 Git 存储库中的二等公民?

  2. 为什么 git 不允许同时使用--alland --tags


PS。我知道有一个--follow-tags选择。我知道有些人不推荐推送所有标签,但这个线程不是关于那个的。


man git-push

- 全部

推送所有分支(即 refs/heads/ 下的 refs);不能与其他 <refspec> 一起使用。

--标签

除了在命令行上明确列出的 refspecs 之外,所有 refs/tags 下的 refs 都会被推送。

标签: gitgit-push

解决方案


消息“ --all and --tags are incompatible”来自builtin/push.c#cmd_push()

这是Marek Zawirski在2008 年 8 月的提交 b259f09中引入的(Git v1.6.1-rc1):

对非法组合选项进行更详细的推送

可能不清楚--all,--mirror--tags/或显式 refspec 是git push.

Git 在这些情况下默默地失败了,而我们可以更恰当地抱怨它。

2008 年,Marek在 JGit中实现git push,并提出了上面提到的补丁,并补充说:

这个我忘了,很久以前就报道过了。

似乎可能真的不清楚 git 失败$ git push --tags --all和类似情况发生了什么,因为它可能与实现相关。

虽然可以使用以下方式配置遥控器

[remote "origin"]
  push = refs/heads/*
  push = refs/tags/*

Jeff King 发现了一个错误(某种死锁),这可能就是这个补丁存在的原因。

发件人做了一个“告诉我更多”,然后等待回复。
接收者得到了更多的信息,但从不说其他任何东西,大概是因为他没有那个提交(因为 master 领先于任何标签)。

简而言之,单独推送分支和标签似乎比将它们推送在一起更容易支持。

通过“同时推送 git 提交和标签”、使用git push --follow-tags或来查看更多信息git config --global push.followTags true


推荐阅读