之前使用sae作为测试服务器,无奈云豆实在是消耗极快,于是就在阿里云上买了一个SEC, 还好当时是学生价。 因为之前用的sae提供的git作开发,迁移过来之后,也就想搭建一个git服务器,可以方便使用,并且还可以做到push上去代码,web页面可以自动更新了。 查了一些资料,大部分都一样, 不过也饶了一点弯路,最终搭建完成,记录于此。
前期准备
假设你已经有了一个sudo权限的用户或者直接root用户也可以.(root无需sudo)
- 安装git
1
sudo apt-get install git
- 建立git用户,最好有一个单独的git用户。输入密码,后面直接回车就好了 如果想要
1
sudo adduser git
git
用户拥有sudo
,直接在/etc/sudoers
的root ALL=(ALL:ALL) ALL
下面加一行:git ALL=(ALL:ALL) ALL
创建裸仓库
我们需要知道远程仓库与本地仓库其实没有区别,因此也需要一个仓库,不过这里建立的是裸仓库与普通仓库的差别就是,裸仓库不保存原文件,只是保存git的历史提交记录。 这里我们需要切换到上面创建的git用户了。 1
2
3
4
5
6su git
cd
mkdir myrepo
cd myrepo
# 建立裸仓库
git init --bare myrepo.git/home/git/myrepo
目录下了, 这个可以根据自己情况来修改,但是 需要注意目录的owner必须是git
(sudo chown -R git:git myrepo)
本地客户端推送
添加ssh到服务器
- 如果已经生成了ssh-key,则跳过此步,没有的话,直接
ssh-keygen
即可 - 将公钥保存到主机上: ### 本地测试 在本地仓库,建立测试push
1
ssh-copy-id git@server
如果去服务器的1
2
3
4
5
6
7
8
9
10cd
mkdir testgit && cd testgit
git init
touch readme | echo 'hello' > readm
git add readme
git commit -m 'inti'
# 后面的.git路径就是上面建立的裸仓库
git remote add origin git@yourserver:/home/git/myrepo/myrepo.git
git push origin mastermyrepo
目录下看看,啥都没有; 这就对了,因为上面建立的就是裸仓库,是不应该看到文件的。下面就说一下怎么看见文件,这个一个很常见的应用便是部署web应用,我们需要的是push上代码之后,页面可以自动刷新,git的hooks
就可以完成这个任务。
添加hooks自动部署
我们把代码push到git服务器上之后,如果可以立即更新nginx目录下的web源码,不就省了很大力气了去手动修改了吗.
Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。
有多种hook
可以使用,具体可以看这个介绍:hook 这里我们需要的是post-receive
:在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户. 下面开始编写这个小脚本,首先该脚本在myrepo.git
目录里面的hooks目录里面。 1
2cd ~/myrepo/myrepo.git/hooks
vim post-receive1
2#/bin/sh
GIT_WORK_TREE=/usr/share/nginx/html/ git checkout -fGTI_WORK_TREE
为你的web工程的目录,需要注意的是,该目录的own必须是git. 之后需要给该脚本加入执行权限: 1
chmod +x post-receive
到此就全部完成了,可以测试一下页面有没有变化.不过还有一个地方可以做一下:就是取消git
用户的bash登录,这个是为了安全起见: 打开/etc/passwd
,找到 1
git:x:1001:1001:,,,:/home/git:/bin/bash
1
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
/usr/bin/git-shell
为git-shell
的位置,可以使用which git-shell
确认。 这样设置好了之后,git用户就不能登录shell, 专门负责git.