GIT之git及git服务搭建

GIT是一种分布式VCS,他的.git目录是一个压缩过的文件数据库,包含了这个所有文件历史对象,外边的文件其实就是从.git目录取出来的。所有的文件历史都是用sha1码唯一区别。
多数VCS保存的是版本间文件差异,Git保存的是每个版本的快照,每次diff的时候,都是临时计算的差异。
GIT的分支只是对增加一个指向一次commit的sha1指针,花销非常小,不用完全备份文件目录。

Git 可以使用四种主要的协议来传输数据:本地传输,SSH 协议,Git 协议和 HTTP 协议.
本地传输,就是仓库在一个本地共享的一个文件系统上,速度快,但设定文件共享麻烦,命令如下:git clone /opt/git/project.git
ssh协议,需要ssh支持,方便权限控制,安全,速度快,但不支持匿名访问,命令如下:git clone ssh://user@server:project.git 不指明某个协议,这时 Git 会默认使用 SSH,而不是git协议
git协议,git自带,速度最快,但授权机制弱,要么全都能写,要么全都不能写,
HTTP(S)协议,任何http服务器均可,配置简单,但是效率太低,授权配置复杂。命令如下:git clone http://example.com/gitproject.git
一般来讲,服务器支持ssh协议配置几个拥有推送权限的开发者,同时开git协议,用户只有读权限,比较合理。

首先准备一个git目录:git clone --bare project  project.git效果略同于cp -Rf project/.git project.git放置到仓库目录下,
如果是SSH架设的话,可以建立一个公共的git账户,然后通过把客户端公钥放入服务器账户的~/.ssh/authorized_keys文件中即可,这样不用输入密码。密钥生成命令:ssh-keygen -t rsa -C "comments", 查看与开启关闭ssh服务:/etc/init.d/ssh status/start/stop
如果是HTTP架设的话,把project.git放入htdocs目录下,然后进入project.git,执行mv hooks/post-update.sample hooks/post-update即可,权限由apache的配置完成。
如果git架设的话,执行git daemon --export-all --enable=receive-pack --base-path=/opt/git/,或者把这条命令加入etc/init.d等作为开机自运行后台服务。

关于git架设操作补充:
etc/init.d/local-git-daemon文件内容可简单如下:
start on startup
stop on shutdown
exec /usr/bin/git daemon \
    --user=git-ro --group=git-ro \
    --reuseaddr \
    --base-path=/opt/git/ \
    /opt/git/
respawn
如果服务进程被意外关闭,可以通过initctl start local-git-daemon来重新启动。
另外,为了方便权限管理,我们一般新建一个git-ro的只读用户来启动这个进程。

gitosis是一个用来帮助管理ssh和git等协议权限的辅助工具,简化和统一权限配置。可用来替代authorized_keys以及git-daemon-export-ok文件。
gitosis本身是一个git工程,通过修改该git的内容即可完成操作,路径如下git clone git://eagain.net/gitosis.git。他的工作依赖与一些python工具,因此需要先安装python包apt-get install python-setuptools,

对于SSH协议,用户可以删除authorized_keys了,然后可以用一个私人(比如scott)的公钥作为管理员,执行sudo -H -u git-ro gitosis-init < /tmp/id_dsa.pub, 然后修改权限sudo chmod 755 /opt/git/gitosis-admin.git/hooks/post-update,
这是,可以在客户端用ssh git-ro@gitserver,测试登录了,由于没有任何git命令,会自动断开,可以用git clone git@gitserver:gitosis-admin.git,把gitosis的管理工程下载下来,其中gitosis.conf 文件是用来设置用户、仓库和权限的控制文件,keystore包含用户的密钥,此时包含一个初始用户的密钥。
在conf文件中[group gitosis-admin]表示目前只有scott一个用户,并且可以读写gitosis-admin工程,此时scott可以通过修改本次文件,然后提交到服务器上使其配置生效。
我们可以照此创建一个新的工程myproject,无须创建裸仓库,在客户端加入git remote add origin git@gitserver:iphone_project.git,不要指定绝对路径,依据--base-path参数设定的相对路径即可,客户端直接push即可git push origin master,
如果要添加更多用户,可以把其他人的公钥添加进keystore目录下,命名为.pub,然后通过分组控制权限。
另外,由于我们目前是以git-ro用户操作gitosis的,因此gitosis默认把仓库放在/home/git-ro/下,我们可以通过ln -s /opt/git /home/git-ro/repositories链接过去。

对于git协议,如果想通过gitosis管理,让用户通过匿名只读访问,可以在conf文件结尾添加
[repo iphone_project]
daemon = yes
即可,并可以删除各个git目录下的git-daemon-export-ok文件。对于git协议权限的管理,由于git进程是有git-ro用户启动的,git-ro对仓库只有只读的权限,因此其他用户访问时也就只有只读权限,不能进行更细致的权限分配。SSH却可以。

你可能感兴趣的:(GIT之git及git服务搭建)