13.4 创建生成裸版本库

    空标题文档 - 图1

    命令git init在“第4章Git初始化”一章就已经用到了,是用于初始化一个版本库的。之前执行git init命令初始化的版本库是带工作区的,如何以裸版本库的方式初始化一个版本库呢?奥秘就在于—bare参数。

    下面的命令会在目录/path/to/repos/demo-init.git中创建一个空的裸版本库。


    $git init—bare/path/to/repos/demo-init.git Initialized empty Git repository in/path/to/repos/demo-init.git/

    创建的果真是裸版本库吗?

    看看/path/to/repos/demo-init.git下的内容:


    $ls-F/path/to/repos/demo-init.git branches/config description HEAD hooks/info/objects/refs/

    看看这个版本库的配置core.bare的值:


    $git—git-dir=/path/to/repos/demo-init.git config core.bare true

    可是空版本库没有内容啊,那就执行PUSH操作为其创建内容呗。


    $cd/path/to/my/workspace/demo $git push/path/to/repos/demo-init.git No refs in common and none specified;doing nothing. Perhaps you should specify a branch such as 'master'. fatal:The remote end hung up unexpectedly error:failed to push some refs to '/path/to/repos/demo-init.git'

    为什么出错了?翻译一下错误输出。


    $cd/path/to/my/workspace/demo $git push/path/to/repos/demo-init.git 没有指定要推送的引用,而且两个版本库也没有共同的引用。 所以什么也没有做。 可能您需要提供要推送的分支名,如'master'。 严重错误:远程操作意外终止 错误:部分引用推送失败,至'/path/to/repos/demo-init.git'

    关于这个问题的详细说明要在第3篇第19章“19.4 PUSH和PULL操作和远程版本库”小节中介绍,这里先说一个省略版:因为/path/to/repos/demo-init.git版本库刚刚初始化完成,还没有任何提交,更不要说分支了。当执行git push命令时,如果没有设定推送的分支,而且当前分支也没有注册到远程的某个分支,将检查远程分支是否有和本地相同的分支名(如master),如果有,则推送,否则报错。

    所以需要把git push命令写得再完整一些。像下面这样操作,就可以完成向空的裸版本库的推送。


    $git push/path/to/repos/demo-init.git master:master Counting objects:26,done. Delta compression using up to 2 threads. Compressing objects:100%(20/20),done. Writing objects:100%(26/26),2.49 KiB,done. Total 26(delta 8),reused 0(delta 0) Unpacking objects:100%(26/26),done. To/path/to/repos/demo-init.git *[new branch]master->master

    上面的git push命令也可以简写为:git push/path/to/repos/demo-init.git master。

    推送成功了吗?看看demo-init.git版本库中的提交。


    $git—git-dir=/path/to/repos/demo-init.git log—oneline-2 0285742 sync test 4 d4b42b7 sync test 3

    好了继续在demo中执行几次提交。


    $cd/path/to/my/workspace/demo/ $git commit—allow-empty-m "sync test 5" [master 424aa67]sync test 5 $git commit—allow-empty-m "sync test 6" [master 70a5aa7]sync test 6

    然后再向demo-init.git推送。注意这次使用的命令。


    $git push/path/to/repos/demo-init.git Counting objects:2,done. Delta compression using up to 2 threads. Compressing objects:100%(2/2),done. Writing objects:100%(2/2),273 bytes,done. Total 2(delta 1),reused 0(delta 0) Unpacking objects:100%(2/2),done. To/path/to/repos/demo-init.git 0285742..70a5aa7 master->master

    为什么这次使用git push命令后面没有跟上分支名呢?这是因为远程版本库(demo-init.git)中已经不再是空版本库了,有名为master的分支。

    通过下面的命令可以查看远程版本库的分支。


    $git ls-remote/path/to/repos/demo-init.git 70a5aa7a7469076fd435a9e4f89c4657ba603ced HEAD 70a5aa7a7469076fd435a9e4f89c4657ba603ced refs/heads/master

    至此相信您已经能够把鸡蛋放在不同的篮子中了,也对使用Git更加有信心了吧。