Git / Gitolite 的应用学习

前面写了svn相关的配置和学习,咱们本身目前在用的也是svn。其大多为开发在用,且权限也分配的很精细。因此通常不须要过多的操做什么。备份方面,除了脚本备份,还有共享存储。因此通常也不会有什么问题。python

趁这几天顺便把Git也学习下,以防之后会用到这个。Git的好处就不在此多说了,相比svn那也能够罗列不少出来。另外一个,git和github结合也是很好的,冲这个也应该学习下。git

因为以前的svn用到了很精细的权限控制,因此这里结合Gitolite来一块儿学习下。因此就分server和client。github

1、Client端:windows

Linux下若是有就不须要在安装了,有没有用命令看下就好,直接在命令行敲 git 不报错即OK。没有用yum安装git就行了,windows下到官网下载安装包,直接下一步就OK。Git官网:http://git-scm.com/download/ 若是你打不开,那你懂的......服务器

windows下安装OK了,会有Git Bash的命令行工具。点击进去后以下:app

wKiom1TdgjjgA27wAAEHkhpn8Qs587.jpg

运行正常的话,咱们来生成个秘钥,来为之后管理git使用。我已经生成过了,因此这里命令就不执行了。执行ssh-keygen -t rsa一路回车便可在当前用户的家目录下生成秘钥。dom

wKiom1TdonLg5HxHAADbitOPnKI801.jpg

如今要把公钥重命名下(为了方便识别用户)并上传到准备安装Git的服务器作认证。ssh

wKiom1Tdo8zQea_gAADq1olVPMw188.jpg

目前为止,client能够先作这么多了,若是是Linux的client,也是同样的操做。相对更方便些。
ide



2、Server端:svn

目前CentOS6已经集成了Git,因此无需再去安装Git,可是要用到Gitolite,就须要安装了。

# cat /etc/issue
CentOS release 6.2 (Final)
 
# rpm -qa git
git-1.7.1-2.el6_0.1.x86_64
 
# 新建仓库目录
# mkdir /src/project -pv
 
# 新建git用户管理git
# useradd git
 
# 作一个仓库的连接到家目录下的
# chown -R git.git /src
# su - git
$ ln -sv /src/project /home/git/repositories
 
# clone gitolite仓库
$ git clone git://github.com/sitaramc/gitolite
$ pwd
/home/git/gitolite
$ ./install --help                    # 能够查看安装的一些参数说明等信息
$ mkdir ../bin                        # 在家目录建立一个bin目录来安装
$ ./install -to /home/git/bin/        # 就是cp目录下的src目录
 
# 使用公钥建立初始化版本库
$ gitolite setup -pk /tmp/chenfeng.pub 
Initialized empty Git repository in /src/project/gitolite-admin.git/
Initialized empty Git repository in /src/project/testing.git/
# 这样就说明成功了。
$ pwd
/home/git/repositories
$ ls
gitolite-admin.git  testing.git       # 能够看到两个目录,一个帐户管理的,一个测试的
 
# 如今client就能够clone版本库,并进行用户管理和代码编写工做了。

签出版本前,咱们能够测试下ssh的公钥认证是否成功:

wKioL1TdqZmAmWKBAAEqZ9dID8Y146.jpg

如上信息。说明ssh公钥认证已正常。并且也显示了对哪些库有什么权限。不然就要检查。


3、客户端签出版本库

服务器端的Git是为了用户共享项目的,因此不该该直接在服务器上操做。这里就在客户端签出并管理用户和版本库。

wKiom1TdqRDS5QazAAHFdrXz8gw513.jpg

从上面能够看到,版本库签出正常。能够看到签出的gitolite-admin管理库下有两个文件夹

conf: 配置用户权限的文件夹

keydir: 公钥存放位置

下面对这两个进行说明:

wKiom1TdqcfSj_BrAAE-v0wetpY464.jpg

从内容就很容易看到咱们上次的ssh测试时看到权限的定义。此时咱们把testing这个库的权限更改下来测试看下效果:

wKioL1TdrHWCGONCAALSL7PNGF8550.jpg

上述的几个命令的意思:

git add .: 添加已修改的文件到暂存区

git commit -am "some information": 把已修改的文件都添加到暂存区并提交到仓库

git push origin master: 推送到Git服务器到主版本

明白上述几个参数的意思后,如今来看在同步testing的库的时候看看是什么结果:

wKioL1Tdrtfi-Ez0AAFY1qYPgmk105.jpg

此时就报错了,提示没有权限或者访问的库不存在。从这里就能够看到简单的权限控制了,其实跟svn的差异不是很大。


4、设置其余用户权限

如今本地的windows客户端已是管理员权限了,假设咱们又有一台Linux的客户端也须要使用,若是给他权限,下面就来演示:

首先生成秘钥:

# ssh-keygen -t rsa
# cd .ssh/
# mv id_rsa.pub 104.pub     # 重命名是为了方便识别的
# yum -y install lrzsz
# sz 104.pub                # 下载到windows上,并放到windows上的gitolite-admin下的keysdir
# mkdir -pv /src/project    # 新建版本库的目录

添加完成后,咱们在windows客户端操做,使Git服务器识别该主机的信息

wKioL1TdsSGCmhFeAAKJKPOlvw8999.jpg

一、咱们首先把104加到testing库的权限上

二、git status: 能够查看当前的工做区的状态信息(修改、新增等)

wKioL1TdtXzgPWs4AAGSVgj6u_0863.jpg

wKiom1TdtISiR9MeAAH5b5HoK2A293.jpg

这里直接省略了origin master这参数,可能会有警告。上述就是提交后并推送到服务器。此时,104这台机器对testing库就拥有了读写和更新的权限。这里的用户是和公钥的名称一致的。

在Linux 104客户端作测试:

# cd /src/project
# git clone git@10.95.10.103:testing
Initialized empty Git repository in /src/project/testing/.git/
warning: You appear to have cloned an empty repository.
# ls
testing
# 这里看到能够正常clone下一个testing库。由于testing库里面没有任何内容。因此提示为空

到此,添加用户以及受权基本完成。并学习了几个命令。


5、新建项目库并同步到服务器和其余用户协同工做

一、首先要先在服务器注册库并分配权限

wKioL1TduaHBFSgIAAHD8282w-c966.jpg

git diff: 能够显示修改的文件内容。

从上述能够看到

新增了一个用户组:@platform_team,且有两个用户chengfeng 104

新增了一个库:platform,且该组有读写更新权限,全部人有读权限

wKiom1Tdz3-SxWgdAALhMEkvrVQ751.jpg

此时,push后会自动在服务器端建立一个注册的库。

而后能够在Linux客户端和windows客户端同时clone下来platform库。

# git clone git@10.95.10.103:platform
Initialized empty Git repository in /src/project/platform/.git/
warning: You appear to have cloned an empty repository.
# ls
platform  testing
# 如今能够看到库了。


二、建立第一个README文件

wKiom1Td0gmiXZYkAAKKHneQc54820.jpg

上面添加了一个README文件。并推送到了Git服务器。如今Linux客户端能够pull到最新的类容了。

# cd platform/
# git pull                    # 拉取Git服务器的最新数据
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From 10.95.10.103:platform
 * [new branch]      master     -> origin/master
# ls
README
# cat README 
This is Git Test File.

如今就能够看到两台机器都有数据了。权限也是生效的。


6、Git的一些其余命令

# git commit -m "add two lines."
[master 0cf7775] add two lines.
 Committer: root <root@localhost.localdomain>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

If the identity used for this commit is wrong, you can fix it with:

    git commit --amend --author='Your Name <you@example.com>'

#上述提示的是由于咱们在Linux客户端第一次提交修改,因此须要设置一些参数,能够设置为全局参数,也能够每次提交时都写用户和邮箱。下面咱们设置全局参数。
# git config --global user.name "104"
# git config --global user.email "104@admin.com"
# git add .
# git commit -m "add two lines."
# git push origin master
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 290 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@10.95.10.103:platform
   fe2f251..0cf7775  master -> master
# 如今提交推送都正常了。

如今咱们在windows上checkout出最新版本:

wKioL1TfBH2Tu5xKAADeSbA_Crs527.jpg

如今假如咱们作了一些错误的修改,而且提交了。想回到为提交以前的版本:

wKioL1TfBbvCgqmQAAFakZSYQUI241.jpg

上面能够看到我删除了两行,也添加了新行。

wKioL1TfBhGTgRlsAAEO3B8MbqI350.jpg

能够看到已经回到了刚刚更新的状态。命令以下:

git reset --hard HEAD^: 回到全部内容到上个版本,上上个就是:HEAD^^,上10个就是:HEAD~10

还有不少相关的命令须要慢慢去了解。

git revert HEAD: 撤销某次提交,并生成一个新的提交

命令太多。之后用到再说...


                                    若有错误,还请指出