git push --all --tags:不兼容

Cyk*_*ker 11 git git-push

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

# git push origin --all --tags
fatal: --all and --tags are incompatible
Run Code Online (Sandbox Code Playgroud)

但是,这有效:

# git push origin refs/heads refs/tags
Everything up-to-date
Run Code Online (Sandbox Code Playgroud)

问题:

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

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


附注。我知道有一个--follow-tags选择。我知道有些人不建议推送所有标签,但此线程与此无关。


man git-push

- 全部

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

--标签

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

Von*_*onC 5

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

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

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

这可能是不清楚的是--all--mirror--tags和/或明确refspecs是非法的组合git push

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

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

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

似乎可能真的不清楚 git 失败$ git push --tags --all和类似的原因,因为它可能与实现有关。

虽然可以通过以下方式配置遥控器

[remote "origin"]
  push = refs/heads/*
  push = refs/tags/*
Run Code Online (Sandbox Code Playgroud)

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

发件人执行“告诉我更多”,然后等待线路返回。
接收者得到了tellme-more,但从不说其他任何东西,大概是因为他没有那个提交(因为master在任何标签之前)。

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

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