13.4 创建生成裸版本库
命令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更加有信心了吧。