关于Git
Git是分布式版本控制系统的一个完美实现,它与集中式版本控制系统SVN的基本区别如下:
1、Git是分布式的,而SVN不是
2、Git和SVN一样有自己的集中式版本库或服务器。但,GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。
3、Git将内容按元数据方式存储,而SVN是按文件
所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它们差距很大。因为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
4、Git分支和SVN分支的不同
SVN的分支就是版本库中的另外一个目录,而Git的分支却是整个版本库的一个快照,而且可以在同一个工作目录下快速的在几个分支间切换。
5、Git没有一个全局的版本号,而SVN有
SVN的版本号实际是任何一个相应时间的源代码快照。而Git并没有这样的一个全局版本号,这也是Git缺少的最大的一个特征
6、Git的内容完整性要优于SVN
Git的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
Git的基本工作流程如下:
在工作目录中修改某些文件。
对修改后的文件进行快照,然后保存到暂存区域。
提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。
Git的安装和配置
(1) 使用yum源安装git
yum install git
查看git版本号
git --version
输出:
version 1.9.0
(2) 创建git用户并设置密码
useradd -m git passwd git //可以设置一个密码,建议不设密码
gitosis的安装
(1) python-setuptools的安装(因为gitosis的安装脚本是用python写的,已经安装过python的不需要再安装)
yum install python-setuptools
(2) gitosis 的安装
git clone https://github.com/cdiwo/gitosis.git //下载gitosis到你想存放的目录下 cd gitosis python setup.py install //如果没有报错,则说明安装成功
(3) 创建是用这个git server的用户的公钥
因为gitosis的访问是通过ssh访问的,所以我们还需要创建一个ssh的访问公钥。找另外一台机器(如果条件允许)作为git server的客户端机器创建公钥,然后传到git服务器上。
su git ssh-keygen -t rsa
一路按回车,默认会生成 /home/git/.ssh/id_rsa.pub 公钥文件,有了密钥以后便可初始化gitosis,使gitosis获得对Git的管理权限
su gitosis-init < /home/git/.ssh/id_rsa.pub
如果使用另外一台客户端机器A生成公钥,那么将它传到服务器/tmp目录下再初始化gitosis也是可以的
gitosis-init < /tmp/id_rsa.pub
执行完成后,提示
Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/ Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
表示初始化成功,会在/home/git/repositories创建gitosis-admin.git项目,可以通过维护这个项目来对gitosis进行配置。
除此以外,还需要对gitosis-admin.git/hooks/post-update目录赋上特殊权限:
chmod u+x /home/git/repositories/gitosis-admin.git/hooks/post-update
至此,服务器端的gitosis配置就完成了。
Git 资源库和权限管理
(1) 创建并初始化资源库
cd /home/git mkdir test.git git init --bare
测试新创建的资源库是否可用
cd /home/test/ git clone /home/git/test.git
如果显示" Initialized empty Git repository in /home/git/test.git",则说明成功的clone了一个local repository。之后就可以在此repository下进行开发了,比如,添加一个readme.txt文件
vi readme.txt git add . #注意后面有个".", 表示当前目录 git commit -a git push origin master
注意:如果此时报错,最大的原因是test.git的refs和objects目录的权限不够,执行如下操作即可(git server端的repository下的这两个目录)。
chmod -R 777 refs/ chmod -R 777 objects/
(3) 检出 gitosis
git clone git@192.168.x.xx:/home/git/repositories/gitosis-admin.git
(4) 配置gitosis
cd gitosis-admin vi gitosis.conf # vi 会看到下面的内容 [gitosis] [group gitosis-admin] #组名称 writable = gitosis-admin #可写资源库列表,多个资源库使用”空格“隔开 members = git@myname.local #用户列表,多个用户使用”空格“隔开 #如果新增一个可读写用户,需要将公钥复制到key_dir当中,并修改gitosis.conf文件
Git Hooks 自动部署
git 本地提交后,每次都要到服务器上pull才能更新代码,这是一件很麻烦事情,如果你的应用环境和git资源库在同一台服务上,那么我们可以使用git的hooks自动更新代码,下面提供一种最简单的操作方式:
(1) 创建 post-receive 文件
cd hooks vi post-receive
(2) 修改 post-receive 文件,将下面的代码复制到打开的post-receive文件中
#!/bin/sh export LANG=zh_CN.UTF-8 cd /home/wwwroot/test/code #服务器发布路径 unset GIT_DIR #注意如果没这句,将会提示"fatal: Not a git repository: '.'"错误 git pull origin master
(3) 给 post-receive 可执行权限
chmod +x post-receive
(4) 客户端执行pull操作
vi README #随便添加一个文件或内容 git add . git commit -m 'Add README' git push
执行完成后,如果提示"remote: error: 无法打开 .git/FETCH_HEAD",修改服务器发布路径中的 .git 文件夹权限为777。
其他
如果使用本地生成public密钥上传到服务器,需要将id_rsa.pub的内容添加到服务器~/.ssh/authorized_keys中,这样就可以免密码登录了。
cat id_rsa.pub >> authorized_keys
注意:目录.ssh和authorized_keys的权限必须是600
密钥的拷贝方式也可以在本地生成后,通过 ssh-copy-id 命令复制到服务器端:
ssh-keygen ssh-copy-id git@serverhost
处理非标准SSH端口的git clone命令连接
使用git clone
命令clone
项目时,如果repository的SSH
端口不是标准22
端口时(例如,SSH tunnel
模式,等等),可以使用如下命令:
git clone ssh://git@host:port/.../xxx.git
举例如下:
git clone ssh://git@120.27.50.136:2222/home/test.git