当我尝试将所有分支和标签推送到远程时,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)
问题:
为什么 git 命名 push-all-branches--all
而不是--branches
or --heads
?git push origin --all
只推送分支,而不是所有引用。这种命名背后的哲学是什么?这是否意味着标签真的是 Git 存储库中的二等公民?
为什么 git 不允许同时使用--all
and --tags
?
附注。我知道有一个--follow-tags
选择。我知道有些人不建议推送所有标签,但此线程与此无关。
man git-push
:
- 全部
推送所有分支(即 refs/heads/ 下的 refs);不能与其他 <refspec> 一起使用。
--标签
除了在命令行中明确列出的 refspecs 之外,refs/tags 下的所有 refs 都会被推送。
消息“ --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
。