Git起步
8/23/2009 11:14:18 PM
我的学习路径:git basic, http webdav, git-svn, gitosis, gitweb,下面是一些学习记录。
http webdav方式访问
ubuntu下安装非常简单,用apt装上git-core包即可。git仓库的外部访问,首先就是最熟悉的用http协议走apache上的webdav服务,方便啊。git自身的身份认证和权限分配弱了一些,不过可以借助apache实现用户分配,passwd文件直接用svn的也没问题。apache配置示例如下:
Alias /git "/big2/git"
<Location /git/test.git>
DAV on
AuthType Basic
AuthName "Test git freely"
AuthUserFile "/big2/svn/svnpasswd"
#Require user Fwolf
Require valid-user
</Location>
但这样远不如使用ssh/git协议访问仓库速度快和稳定,但更适合公开/对外发布。另外和svn的webdav方式不同,git webdav是一种dumb transport
,不仅慢而且比较傻,只能进行简单的存、取文件操作,所以hooks是不起作用的(很多文章中说的提交后要在hooks/post-update
里启用git-update-server-info
,指的是git/ssh方式更新后,为webdav对外发布作准备)不会自动进行和git相关的其它处理。
最好用的还是gitosis,后面会提到。有些内容先以webdav方式下来记,使用的时候根据不同的方式转换用户角色即可。
创建服务端的仓库
其实和svn创建仓库也是比较类似的,找一空目录,比如叫test.git
,执行:
$ git --bare init
$ sudo chown www-data:www-data * -R
客户端就可以下载了,但还有些问题:
$ git clone https://domain.tld/git/test.git gittest
Initialized empty Git repository in /home/fwolf/dev/gittest/.git/
error: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt
首先遇到的是证书错误,git使用curl,所以证书的处理和svn也不一样,用firefox浏览git网站,在Page Info->View Certificate->Details中把网站的根证书(Issued By/root)导出为一个pem文件,然后将这个pem文件的内容添加到/etc/ssl/certs/ca-certificates.crt
的末尾就可以了。接着遇到的是401身份验证错误:
error: The requested URL returned error: 401
git不像svn会自动提示用户名/密码,因为它用的是webdav的原生功能,所以需要在$HOME
下创建文件.netrc
(记得将权限修改为600):
machine domain.tld
login Fwolf
password your_passwd
最后,还是仓库本身不完善的问题:
warning: remote HEAD refers to nonexistent ref, unable to checkout.
在服务器上仓库目录,执行$ git update-server-info
并再次chown到www-data就行了。初次push得指明服务器上的origin对应本地master分支/branch:
$ git push origin master
而下载之前,还要设置下载后放到那个分支、与哪个分支的现有内容进行merge:
$ git config branch.master.remote origin
$ git config branch.master.merge master
$ git pull # 注意如果服务器是新建的空repo,得随便push点东西才好pull
gitosis
还是通过apt安装,gitosis使用SSH key来认证用户,但用户不需要在主机上开账号,而是公用主机上的一个受限账号。首先创建这个账号(名称可变):
sudo adduser /
--system /
--shell /bin/sh /
--gecos 'git user' /
--group /
--disabled-password /
--home /big2/gitosis /
git
然后生成自己用户的ssh密钥,可以在git用户的$HOME下操作:
ssh-keygen -t rsa
不要密码,可以起名叫git_rsa[.pub],然后用公钥来初始化gitosis的目录:
$ sudo -H -u git gitosis-init < /home/fwolf/.ssh/git_rsa.pub
Initialized empty Git repository in /big2/gitosis/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /big2/gitosis/repositories/gitosis-admin.git/
可以看出gitosis自己也在用git仓库的形式存储东西,传递公