14

当我在我的 gitolite 存储库上创建一个新的存储库时,我总是必须输入以下命令才能开始将代码推送到服务器。

git push origin master:refs/heads/master

它有什么作用 ?

我的猜测是这与不确定的头部参考有关。有人可以向我解释吗?

4

4 回答 4

29

该命令分为三个部分:

git push

这会调用 push 命令

origin

这会命名您要推送到的遥控器。这是存储在 .git/config 中的命名远程之一(您可以使用 列出这些git remote)、URL 或.表示当前存储库的令牌。

master:refs/heads/master

这称为“refspec”,您可以在git push. 但总的来说,它由两部分组成,用冒号分隔。第一部分是本地分支的名称,第二部分是远程存储库上的分支名称(在本例中为origin)。这个特定的 refspec 可以缩短为master:master.

一般来说,可以进一步缩短 refspecs。仅仅指定master为 refspec 就相当于在遥控器上使用相同的名称,所以mastermaster:master.

于 2011-09-21T21:30:07.847 回答
5

master:refs/heads/master是一个参考规范。

refspecs是形式+<src>:<dst>

因此,这里的 master 是您要推送到refs/heads/master远程(来源)上的 refspec 的本地 repo 上的 ref。master实际上是缩写refs/heads/master

事实上,您可以这样做git push origin master,它将您本地的 master 推送到远程的 master。只有当您想要推送到不同的 ref 时,您才需要显式指定目标 ref。

也只是 git push具有默认行为,在您进行第一次推送并在遥控器上创建分支(master)之前可能不会出现这种情况。因此,您似乎需要执行您提到的命令。参考手册

于 2011-09-21T21:30:10.403 回答
3

的默认行为git push,大概就是您所描述的“将代码推送到服务器”,是仅在您要推送到的远程上按名称推送具有匹配分支的本地分支。当你创建一个新的仓库时,它里面没有分支,所以一个简单的git push不会推送任何东西。您必须首先按名称显式推送分支。此后,默认行为将按您的预期工作。

PS 其实,你只需要git push origin master. 它所做的是将您的本地主服务器作为主服务器推送到 gitolite 存储库,因为您没有指定不同的名称。如果您说git push origin master:foo,那么您在本地称为“master”的分支在 gitolite 上将被称为“foo”。

PPS 您可以在“无”、“匹配”(默认)、“跟踪”/“上游”和“当前”之间切换默认推送行为。请参阅git-config 手册页上的“push.default”设置。

于 2011-09-21T21:29:45.913 回答
1

它为您设置跟踪。您可以为此使用简写:

git push origin master

冒号后面的部分是远程仓库上分支的名称。如果你省略它,git 会假设你想要相同的名字。

希望这可以帮助。

于 2011-09-21T21:29:10.797 回答