当我在我的 gitolite 存储库上创建一个新的存储库时,我总是必须输入以下命令才能开始将代码推送到服务器。
git push origin master:refs/heads/master
它有什么作用 ?
我的猜测是这与不确定的头部参考有关。有人可以向我解释吗?
该命令分为三个部分:
git push
这会调用 push 命令
origin
这会命名您要推送到的遥控器。这是存储在 .git/config 中的命名远程之一(您可以使用 列出这些git remote
)、URL 或.
表示当前存储库的令牌。
master:refs/heads/master
这称为“refspec”,您可以在git push
. 但总的来说,它由两部分组成,用冒号分隔。第一部分是本地分支的名称,第二部分是远程存储库上的分支名称(在本例中为origin
)。这个特定的 refspec 可以缩短为master:master
.
一般来说,可以进一步缩短 refspecs。仅仅指定master
为 refspec 就相当于在遥控器上使用相同的名称,所以master
与master:master
.
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)之前可能不会出现这种情况。因此,您似乎需要执行您提到的命令。参考手册
的默认行为git push
,大概就是您所描述的“将代码推送到服务器”,是仅在您要推送到的远程上按名称推送具有匹配分支的本地分支。当你创建一个新的仓库时,它里面没有分支,所以一个简单的git push
不会推送任何东西。您必须首先按名称显式推送分支。此后,默认行为将按您的预期工作。
PS 其实,你只需要git push origin master
. 它所做的是将您的本地主服务器作为主服务器推送到 gitolite 存储库,因为您没有指定不同的名称。如果您说git push origin master:foo
,那么您在本地称为“master”的分支在 gitolite 上将被称为“foo”。
PPS 您可以在“无”、“匹配”(默认)、“跟踪”/“上游”和“当前”之间切换默认推送行为。请参阅git-config 手册页上的“push.default”设置。
它为您设置跟踪。您可以为此使用简写:
git push origin master
冒号后面的部分是远程仓库上分支的名称。如果你省略它,git 会假设你想要相同的名字。
希望这可以帮助。