现在搭建git服务器是一件比较简单的事情,有很多现成的工具,个人感觉比较好的是使用GitLab搭建git服务器,搭建完成了只有在电脑的浏览器中输入对应的网址就能看到图形界面,图形界面和github很像,之后创建项目以及管理啥的都很方便。但是,今天的主题并不是使用它来完成git服务器的搭建,而是使用一个相对比较古老的工具来搭建git服务器,至于原因嘛,哎,只能说是历史遗留问题太严重,说多了都是泪,废话不多说,进入今天的正题吧。
git简介:略!网络上的资料很多,自己看。
git安装
本文以ubuntu为例,Linux系统大同小异
- sudo apt-get install openssh-server openssh-client
- sudo apt-get install git-core
然后,为自己配置身份信息,这样多个人提交代码的时候,就可以方便的查看是谁提交的,该如何联系ta了(如果该机器只做服务器,不做开发,本步骤应该 可以省略 )
- git config --global user.name "yourname"
- git config --global user.email "your@email.com"
以上步骤是每个git用户都需要的,接下来,作为“服务器”,为了更好的管理,我们需要进行一些必要的配置!包括环境的配置、管理工具的安装与配置等。
首先,我们最好为其配置一个专门的git用户并设置密码,专门对代码进行管理
- sudo useradd -m git
- sudo passwd git(change to yours)
然后,在新建的git用户主目录下创建一个文件夹作为git的仓库,并为这个仓库配备最基本的安防——权限控制
- sudo mkdir /home/git/repositories # 最好使用repositories作为文件夹名称,这样可以简化后面的操作
- sudo chown git:git /home/git/repositories
- sudo chmod 755 /home/git/repositories
至此,一个简单(非常简单)的git服务器已经搭建好了,可以自己创建一个简单的工程测试一下。
为了方便后面的操作,我们先切换到git用户下
- su git
在respositories下新建一个目录(仓库),并切换到这个目录
- mkdir helloworld
- cd helloworld
在此处初始化一个空的仓库(只能接受push/pull代码,不能本地commit)
- git --bare init
好了,一个空的仓库建立好了,用另外一台安装了git的机器(比如你的开发机)测试一下,此处假设你上面所用的服务器IP为192.168.0.136
- git clone git@192.168.0.136:/home/git/repositories/helloworld
# git@XXX 中的git是指的git服务器所在的用户名,如果git服务器搭在了github用户下,网址就是github@XXX
然后在开发机上进行一些基本操作测试:为这个项目add一些文件,然后commit,然后push,如果除了要几次输入git用户的密码外,其他一切正常的话,那说明上面的安装与配置就已经成功了
到这里其实git服务器已经搭建好了,但是每次操作都需要输入git用户的密码(clone、push),是不是很烦,而且不安全。
使用gitolite的工具实现添加用户公钥的方式,从而简化操作。
gitolite安装
gitolite在初始化时需要通过某一用户的公钥文件指定一个超级管理员(说明:这里的超级管理员指的是git仓库的超级管理员,不是服务器的超级管理员,不要弄混了),gitolite安装成功后,只有这个超级管理员可以更新gitolite以更新各种权限控制(包括对其自身的更新权限控制),所以在初始化时需要指定该超级管理员账户的公钥文件(最好直接将其拷贝到git用户的主文件夹下)(下面的示例程序使用同一服务器上的另一常用管理员用户admin)
- su admin
- cd ~
- ssh-keygen
- cp ~/.ssh/id_id_rsa.pub /home/git/id_rsa.pub
#将admin用户的公钥复制到git服务器所在用户目录下
- su git
好~准备工作已经完成了,开始安装gitolite
- cd ~
- git clone git://github.com/sitaramc/gitolite
# 获取gitolite的源码
- mkdir -p $HOME/bin
#为gitolite的二进制文件生成创建目录
- gitolite/install -to $HOME/bin
# 编译生成安装文件
- $HOME/bin/gitolite setup -pk id_rsa.pub
# 安装并初始化,指定id_rsa.pub公钥文件对应的用户为超级管理员
gitolite安装完成!不过,你要用它来进行管理,那还需要一定的操作。上面提到,gitolite安装后本身是一个特殊的git版本库——gitolite-admin,分布式的进行修改,然后通过push的方式提交,其会通过钩子脚本执行权限更新。看一下上述步骤的最后一步你会发现,gitolite自动生成了两个版本库:gitolite-admin.git和testing.git,其中的gitol-admin.git就是那个特殊的神奇版本库。所以,接下来我们要做的,就是回到你刚刚指定的超级管理员账户的电脑跟账户下,clone出gitolite-admin这个特殊的git版本库(当前情况下,只有该git的超级管理员账户可以clone并更新gitolite-admin这个版本库),然后根据自己的需要对其进行配置(如添加更多的管理员账户、添加新的版本库并为不同的用户指定权限)
- su admin
# 回到指定的git超级管理员账户
- cd ~
- git clone git@192.168.0.136:gitolite-admin.git
# clonegitolite-admin这个特殊的版本库
- cd $HOME/gitolite-admin
# 进入到gitolite-admin下
gitolite-admin文件夹下有两个文件夹,一个是keydir文件夹,另一个是conf文件夹
keydir目录下存放的是用户的公钥
conf目录下的gitolite.conf是用来添加项目文件的
有没有发现,这次clone的时候,后面的路径变短了,密码也不用输了,这一切gitolite已经自动帮你搞定了:默认路径是/home/git/repositories,权限控制是只有当前的超级管理员用户可以访问gitolite-admin和testing两个版本库,你之前测试创建的版本库也已经无法访问,如果你尝试再次clone之前创建的测试版本库,应该就会提示如下错误信息:
假设你之前创建了helloworld版本库,现在使用git clone git@192.168.0.136:helloworld试图clone
FATAL: R any helloworld id_rsa DENIED by fallthru
(or you mis-spelled the reponame)
fatal: The remote end hung up unexppectedly
要继续访问之前创建的项目,需要将这个项目添加到gitolite的权限控制内,下面演示一下为当前的超级管理员用户指定之前创建的helloworld测试版本库的读写权限(可读可写),以此演示gitolite指定权限的一般流程:
添加用户
将需要指定权限的用户的ssh公钥文件,存放在gitolite-admin版本库的keydir目录下(如果提交的都是id_rsa.pub,可以将其重命名为该用户的id或者名称,同时也推荐这样重命名,以明示哪个公钥文件是哪个用户的),因为我们初始化时,gitolite已经将该超级管理员的公钥文件自动拷进去了,所以文件下会有一个公钥文件
添加项目
编辑gitolite-admin/conf目录下的gitolite.conf文件,添加helloworld版本库管理组,为指定用户读写权限(RW+,具体的权限定义,参考gitolite官方文档)
repo helloworld
RW+ = @all
#此处的指定为全部用户, 如果指定只有管理员用户能操作则将"@all"替换成"id_rsa",若为其他用户,则指定为该用户的公钥名
添加后会在git服务器上创建了一个helloworld.git的仓库,这个就是原来那个helloworld的仓库了,路径为/home/git/repositories/helloworld.git,原来的helloworld仓库可以保留,也可以不保留,都可以吧。
Tip: 创建项目其实并不需要在/home/git/repositories上创建,只要在gitolite.conf文件中直接添加就可以了,gitolite会自动帮你创建你在gitolite.conf添加的项目的。
无论是进行了用户的添加、删除还是项目的添加、删除等操作,都要使用git commit 到本地然后push到远程仓库
- cd $HOME/gitolite-admin
- git add .
- git commit -m "change gitolite XXX"
- git push origin master
如果push成功,当前超级管理员用户应该就可以成功clone helloworld版本库,并进行添加、删除、修改与push等操作了。
- su admin
- cd ~
- git clone git@192.168.0.136:helloworld.git
文件自动自动备份
当你在项目helloword项目上添加了文件hello.txt然后push到git服务器,你到git服务器中去查看,你会发现服务器的/home/git/repositories/helloworld.git中并不能找到hello.txt文件,但当你使用另一台项目允许用户clone该项目的时候,你会发现该项目中确实存在了hello.txt文件,Amazing!
不管了,现在希望在git用户下能有一个项目备份文件夹helloworld(路径:/home/git/helloworld),当有用户向helloworld.git中push了,/home/git/helloworld中的内容也相应的改变。具体实现:
- 给git用户添加对helloworld.git的 访问权限,具体见上面添加用户中的描述
- su git
- cd ~
- ssh-keygen
- su admin
- cd $HOME/gitolite-addmin/keydir
- cp /home/git/.ssh/id_rsa.pub git.pub
(这里多看两眼)# 注意第二个参数文件的命名不要和已存在公钥名相同,会覆盖的,这样会影响其他用户的使用,特别特别主要,千万千万不要和git服务器超级管理员的公钥即id_rsa.pub重名,要是覆盖了超级管理员的公钥,最坏可能就要重新搭建gitolite(其他解决方法我想了一下,但没有试,第一种方法:可能就是将管理员的公钥再复制进来keydir目录中以及/home/git/id_rsa.pub就行啦, 第二种可能就成了现在添加的git用户变成了git服务器的超级管理员???,没测试,不幸遇到了再说吧)
- git add git.pub
- git commit -m "add git.pub"
- git push origin master
- 切换回git用户,将helloworld.git项目clone下来,具体操作:
- su git
- git clone git@192.168.0.136:helloworld.git
- 实现/home/git/helloworld文件中的文件自动备份git服务器上的helloworld.git中提交的文件在,这里需要通过钩子脚本执行进行自动备份更新
- cd /home/git/repositories/helloworld.git/hooks
*具体的钩子的说明请自行查找网上的其它资料,我懒!在该文件夹下会有post-update(或者post-receive) 或者post-update.sample(post-receive.sample),简单说一下,有.sample的文件是不会执行的,没有.sample的应该是会自动自行的脚本,要是啥文件都没有的话就自己创建一个,我的是post-update,所有编辑post-update
#!/bin/sh
nowdir=`pwd`
gitdir=/home/git/helloworld
unset GIT_DIR # 这句话是很重要的,不能没有
cd $gitdir
git pull origin master
chmod -R o+r *
chmod -R o+x *
cd $nowdir
exit 0
保存,测试一下。
使用admin用户向helloworld中添加一个新文件或者一些操作,git push到服务器上,查看/home/git/helloworld文件夹中是否发生了变化,发生了说明成功啦!
好啦,最后比较懒,结束的有点仓促,就不截图啥的了,就是因为真的好懒!有些是从别的地方看到的,有些是自己的理解,还有以些是自己尝试出来的,大家自己看看吧!如有错误欢迎指出,谢谢!
给个参考吧:
git简介、安装、基本操作——Git折腾小记