13.4 创建生成裸版本库

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更加有信心了吧。