前面写了svn相关的配置和学习,我们自己目前在用的也是svn。其大多为开发在用,且权限也分配的很精细。所以一般不需要过多的操作什么。备份方面,除了脚本备份,还有共享存储。所以一般也不会有什么问题。
趁这几天顺便把Git也学习下,以防以后会用到这个。Git的好处就不在此多说了,相比svn那也可以罗列很多出来。另一个,git和github结合也是很好的,冲这个也应该学习下。
由于之前的svn用到了很精细的权限控制,所以这里结合Gitolite来一起学习下。所以就分server和client。
一、Client端:
windows下安装OK了,会有Git Bash的命令行工具。点击进去后如下:
<a href="http://s3.51cto.com/wyfs02/M00/59/BC/wKiom1TdgjjgA27wAAEHkhpn8Qs587.jpg" target="_blank"></a>
运行正常的话,我们来生成个秘钥,来为以后管理git使用。我已经生成过了,所以这里命令就不执行了。执行ssh-keygen -t rsa一路回车即可在当前用户的家目录下生成秘钥。
<a href="http://s3.51cto.com/wyfs02/M02/59/BE/wKiom1TdonLg5HxHAADbitOPnKI801.jpg" target="_blank"></a>
现在要把公钥重命名下(为了方便识别用户)并上传到准备安装Git的服务器做认证。
<a href="http://s3.51cto.com/wyfs02/M00/59/BE/wKiom1Tdo8zQea_gAADq1olVPMw188.jpg" target="_blank"></a>
目前为止,client可以先做这么多了,如果是Linux的client,也是一样的操作。相对更方便些。
二、Server端:
目前CentOS6已经集成了Git,所以无需再去安装Git,但是要用到Gitolite,就需要安装了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<code># cat /etc/issue</code>
<code>CentOS release </code><code>6.2</code> <code>(Final)</code>
<code> </code>
<code># rpm -qa git</code>
<code>git</code><code>-</code><code>1.7</code><code>.</code><code>1</code><code>-</code><code>2.el6_0</code><code>.</code><code>1.x86_64</code>
<code># 新建仓库目录</code>
<code># mkdir /src/project -pv</code>
<code># 新建git用户管理git</code>
<code># useradd git</code>
<code># 做一个仓库的链接到家目录下的</code>
<code># chown -R git.git /src</code>
<code># su - git</code>
<code>$ ln </code><code>-</code><code>sv </code><code>/</code><code>src</code><code>/</code><code>project </code><code>/</code><code>home</code><code>/</code><code>git</code><code>/</code><code>repositories</code>
<code># clone gitolite仓库</code>
<code>$ git clone git:</code><code>/</code><code>/</code><code>github.com</code><code>/</code><code>sitaramc</code><code>/</code><code>gitolite</code>
<code>$ pwd</code>
<code>/</code><code>home</code><code>/</code><code>git</code><code>/</code><code>gitolite</code>
<code>$ .</code><code>/</code><code>install </code><code>-</code><code>-</code><code>help</code> <code># 可以查看安装的一些参数说明等信息</code>
<code>$ mkdir ..</code><code>/</code><code>bin</code> <code># 在家目录创建一个bin目录来安装</code>
<code>$ .</code><code>/</code><code>install </code><code>-</code><code>to </code><code>/</code><code>home</code><code>/</code><code>git</code><code>/</code><code>bin</code><code>/</code> <code># 就是cp目录下的src目录</code>
<code># 使用公钥创建初始化版本库</code>
<code>$ gitolite setup </code><code>-</code><code>pk </code><code>/</code><code>tmp</code><code>/</code><code>chenfeng.pub </code>
<code>Initialized empty Git repository </code><code>in</code> <code>/</code><code>src</code><code>/</code><code>project</code><code>/</code><code>gitolite</code><code>-</code><code>admin.git</code><code>/</code>
<code>Initialized empty Git repository </code><code>in</code> <code>/</code><code>src</code><code>/</code><code>project</code><code>/</code><code>testing.git</code><code>/</code>
<code># 这样就说明成功了。</code>
<code>/</code><code>home</code><code>/</code><code>git</code><code>/</code><code>repositories</code>
<code>$ ls</code>
<code>gitolite</code><code>-</code><code>admin.git testing.git </code><code># 可以看到两个目录,一个账户管理的,一个测试的</code>
<code># 现在client就可以clone版本库,并进行用户管理和代码编写工作了。</code>
签出版本前,我们可以测试下ssh的公钥认证是否成功:
<a href="http://s3.51cto.com/wyfs02/M01/59/BA/wKioL1TdqZmAmWKBAAEqZ9dID8Y146.jpg" target="_blank"></a>
如上信息。说明ssh公钥认证已正常。而且也显示了对哪些库有什么权限。否则就要检查。
三、客户端签出版本库
服务器端的Git是为了用户共享项目的,所以不应该直接在服务器上操作。这里就在客户端签出并管理用户和版本库。
<a href="http://s3.51cto.com/wyfs02/M01/59/BE/wKiom1TdqRDS5QazAAHFdrXz8gw513.jpg" target="_blank"></a>
从上面可以看到,版本库签出正常。可以看到签出的gitolite-admin管理库下有两个文件夹
conf: 配置用户权限的文件夹
keydir: 公钥存放位置
下面对这两个进行说明:
<a href="http://s3.51cto.com/wyfs02/M02/59/BE/wKiom1TdqcfSj_BrAAE-v0wetpY464.jpg" target="_blank"></a>
从内容就很容易看到我们上次的ssh测试时看到权限的定义。此时我们把testing这个库的权限更改下来测试看下效果:
<a href="http://s3.51cto.com/wyfs02/M00/59/BA/wKioL1TdrHWCGONCAALSL7PNGF8550.jpg" target="_blank"></a>
上述的几个命令的意思:
git add .: 添加已修改的文件到暂存区
git commit -am "some information": 把已修改的文件都添加到暂存区并提交到仓库
git push origin master: 推送到Git服务器到主版本
明白上述几个参数的意思后,现在来看在同步testing的库的时候看看是什么结果:
<a href="http://s3.51cto.com/wyfs02/M02/59/BB/wKioL1Tdrtfi-Ez0AAFY1qYPgmk105.jpg" target="_blank"></a>
此时就报错了,提示没有权限或者访问的库不存在。从这里就可以看到简单的权限控制了,其实跟svn的差别不是很大。
四、设置其他用户权限
现在本地的windows客户端已经是管理员权限了,假设我们又有一台Linux的客户端也需要使用,如果给他权限,下面就来演示:
首先生成秘钥:
<code># ssh-keygen -t rsa</code>
<code># cd .ssh/</code>
<code># mv id_rsa.pub 104.pub # 重命名是为了方便识别的</code>
<code># yum -y install lrzsz</code>
<code># sz 104.pub # 下载到windows上,并放到windows上的gitolite-admin下的keysdir</code>
<code># mkdir -pv /src/project # 新建版本库的目录</code>
添加完成后,我们在windows客户端操作,使Git服务器识别该主机的信息
<a href="http://s3.51cto.com/wyfs02/M02/59/BB/wKioL1TdsSGCmhFeAAKJKPOlvw8999.jpg" target="_blank"></a>
1、我们首先把104加到testing库的权限上
2、git status: 可以查看当前的工作区的状态信息(修改、新增等)
<a href="http://s3.51cto.com/wyfs02/M02/59/BB/wKioL1TdtXzgPWs4AAGSVgj6u_0863.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/59/BE/wKiom1TdtISiR9MeAAH5b5HoK2A293.jpg" target="_blank"></a>
这里直接省略了origin master这参数,可能会有警告。上述就是提交后并推送到服务器。此时,104这台机器对testing库就拥有了读写和更新的权限。这里的用户是和公钥的名称一致的。
在Linux 104客户端做测试:
<code># cd /src/project</code>
<code># git clone [email protected]:testing</code>
<code>Initialized empty Git repository </code><code>in</code> <code>/</code><code>src</code><code>/</code><code>project</code><code>/</code><code>testing</code><code>/</code><code>.git</code><code>/</code>
<code>warning: You appear to have cloned an empty repository.</code>
<code># ls</code>
<code>testing</code>
<code># 这里看到可以正常clone下一个testing库。因为testing库里面没有任何内容。所以提示为空</code>
到此,添加用户以及授权基本完成。并学习了几个命令。
五、新建项目库并同步到服务器和其他用户协同工作
1、首先要先在服务器注册库并分配权限
<a href="http://s3.51cto.com/wyfs02/M00/59/BB/wKioL1TduaHBFSgIAAHD8282w-c966.jpg" target="_blank"></a>
git diff: 可以显示修改的文件内容。
从上述可以看到
新增了一个用户组:@platform_team,且有两个用户chengfeng 104
新增了一个库:platform,且该组有读写更新权限,所有人有读权限
<a href="http://s3.51cto.com/wyfs02/M02/59/BF/wKiom1Tdz3-SxWgdAALhMEkvrVQ751.jpg" target="_blank"></a>
此时,push后会自动在服务器端创建一个注册的库。
然后可以在Linux客户端和windows客户端同时clone下来platform库。
<code># git clone [email protected]:platform</code>
<code>Initialized empty Git repository </code><code>in</code> <code>/</code><code>src</code><code>/</code><code>project</code><code>/</code><code>platform</code><code>/</code><code>.git</code><code>/</code>
<code>platform testing</code>
<code># 现在可以看到库了。</code>
2、创建第一个README文件
<a href="http://s3.51cto.com/wyfs02/M02/59/BF/wKiom1Td0gmiXZYkAAKKHneQc54820.jpg" target="_blank"></a>
上面添加了一个README文件。并推送到了Git服务器。现在Linux客户端可以pull到最新的类容了。
<code># cd platform/</code>
<code># git pull # 拉取Git服务器的最新数据</code>
<code>remote: Counting objects: </code><code>6</code><code>, done.</code>
<code>remote: Compressing objects: </code><code>100</code><code>%</code> <code>(</code><code>2</code><code>/</code><code>2</code><code>), done.</code>
<code>remote: Total </code><code>6</code> <code>(delta </code><code>0</code><code>), reused </code><code>0</code> <code>(delta </code><code>0</code><code>)</code>
<code>Unpacking objects: </code><code>100</code><code>%</code> <code>(</code><code>6</code><code>/</code><code>6</code><code>), done.</code>
<code>From </code><code>10.95</code><code>.</code><code>10.103</code><code>:platform</code>
<code> </code><code>*</code> <code>[new branch] master </code><code>-</code><code>> origin</code><code>/</code><code>master</code>
<code>README</code>
<code># cat README </code>
<code>This </code><code>is</code> <code>Git Test </code><code>File</code><code>.</code>
现在就可以看到两台机器都有数据了。权限也是生效的。
六、Git的一些其他命令
<code># git commit -m "add two lines."</code>
<code>[master </code><code>0cf7775</code><code>] add two lines.</code>
<code> </code><code>Committer: root <[email protected]></code>
<code>Your name </code><code>and</code> <code>email address were configured automatically based</code>
<code>on your username </code><code>and</code> <code>hostname. Please check that they are accurate.</code>
<code>You can suppress this message by setting them explicitly:</code>
<code> </code><code>git config </code><code>-</code><code>-</code><code>global</code> <code>user.name </code><code>"Your Name"</code>
<code> </code><code>git config </code><code>-</code><code>-</code><code>global</code> <code>user.email [email protected]</code>
<code>If the identity used </code><code>for</code> <code>this commit </code><code>is</code> <code>wrong, you can fix it with:</code>
<code> </code><code>git commit </code><code>-</code><code>-</code><code>amend </code><code>-</code><code>-</code><code>author</code><code>=</code><code>'Your Name <[email protected]>'</code>
<code>#上述提示的是因为我们在Linux客户端第一次提交修改,所以需要设置一些参数,可以设置为全局参数,也可以每次提交时都写用户和邮箱。下面我们设置全局参数。</code>
<code># git config --global user.name "104"</code>
<code># git config --global user.email "[email protected]"</code>
<code># git add .</code>
<code># git push origin master</code>
<code>Counting objects: </code><code>5</code><code>, done.</code>
<code>Compressing objects: </code><code>100</code><code>%</code> <code>(</code><code>2</code><code>/</code><code>2</code><code>), done.</code>
<code>Writing objects: </code><code>100</code><code>%</code> <code>(</code><code>3</code><code>/</code><code>3</code><code>), </code><code>290</code> <code>bytes, done.</code>
<code>Total </code><code>3</code> <code>(delta </code><code>0</code><code>), reused </code><code>0</code> <code>(delta </code><code>0</code><code>)</code>
<code>To git@</code><code>10.95</code><code>.</code><code>10.103</code><code>:platform</code>
<code> </code><code>fe2f251..</code><code>0cf7775</code> <code>master </code><code>-</code><code>> master</code>
<code># 现在提交推送都正常了。</code>
现在我们在windows上checkout出最新版本:
<a href="http://s3.51cto.com/wyfs02/M00/59/BF/wKioL1TfBH2Tu5xKAADeSbA_Crs527.jpg" target="_blank"></a>
现在假如我们做了一些错误的修改,并且提交了。想回到为提交之前的版本:
<a href="http://s3.51cto.com/wyfs02/M01/59/BF/wKioL1TfBbvCgqmQAAFakZSYQUI241.jpg" target="_blank"></a>
上面可以看到我删除了两行,也添加了新行。
<a href="http://s3.51cto.com/wyfs02/M02/59/BF/wKioL1TfBhGTgRlsAAEO3B8MbqI350.jpg" target="_blank"></a>
可以看到已经回到了刚刚更新的状态。命令如下:
git reset --hard HEAD^: 回到所有内容到上个版本,上上个就是:HEAD^^,上10个就是:HEAD~10
还有很多相关的命令需要慢慢去了解。
git revert HEAD: 撤销某次提交,并生成一个新的提交
命令太多。以后用到再说...
本文转自Mr_陈 51CTO博客,原文链接:http://blog.51cto.com/chenpipi/1614490,如需转载请自行联系原作者