Skip to content

搭建自己的git服务器管理网站代码

网站有太多的功能想加了,然而并不希望在线调试代码,所以想到了用git。当然不只是git而已,还需要能够预览修改后的效果。所以最开始准备在本地windows 8搭建一个NMP环境,其实搭建过程还好,然而在windows下安装nginx时出了问题,我使用了一个nginx插件subs_filter,在linux下可以很方便地重新编译把插件装上,但是在windows下就直接给的编译好的代码,感觉又得搭一个windows编译环境,好心累……所以放弃这个方案。

第二个方案是本地采用vmware虚拟机,然后通过桥接接到主机,每次打开vmware作为本地环境来预览效果。我的计划总是那么美,实现起来总是那么困难,光是安装debian 8.2就装了好久,大概做了这些:

  1. vmware 10不支持debian 8以上,需要重装vmware 14
  2. 安装debian的过程中总是出错,我以为是安装包有问题,换了好几个,每次都得下载一晚上
  3. 终于找对了方法,原来是没有安装grub引导。但是在更新APT的时候,总是连接不上服务器,又搞了好久。
  4. 终于差不多搞好了,一开机,中文显示方块……又用英文重装,然后再查各种办法解决中文方块的问题(至今未解决,如果你有好的办法还请评论或者邮件教教我)。

于是放弃debian 8.2,转为安装ubuntu,然而,我之前写的debian下一键搭建LNMP环境脚本在ubuntu上是因为一些差异用不了的……意味着我要重新一步一步地搭LNMP……这就是我这么多天没更新文章的原因(╯°Д°)╯︵ ┻━┻ 我投翔,我投翔还不行吗!!!

第三个方案,用之前买的其他的服务器作为“本地环境”,虽然有外网暴露降低网站权重或者出现内部错误代码给攻击机会的危险,但是只要全站反爬+神奇端口+最重要的跪求各位小伙伴不要攻击我这个菜鸡做的根本没有几个人访问的全是bug的十八线小网站,就好了吧……

准备环境

拓扑是这样的: f8d656d89b2584c714d044d622661100.png

  • 网站服务器WS,就是你看到的本站的服务器啦。WS上我们主要需要做的是git服务器配置;
  • 开发服务器DS,就是找的其他的服务器。DS上主要做的是配置git本地环境;
  • 本地机PC,就是写代码的电脑了。

也就是说,预想的正确操作是:PC用PhpStorm开发代码,用自带的ssh提交功能提交到开发服务器上,DS提供web预览,及时地预览效果,当效果稳定后,使用git提交到网站服务器,就完成了功能迭代。同时git还能够做版本控制,想想都有点小激动呢~有关如何搭建LNMP环境、如何配置PhpStorm的ssh,百度一下会出来很多资料,也可以评论和邮件我,这里不多介绍。

相关的版本一览:

机器软件版本
WS/DS操作系统Debian 8.2
WS/DSgit2.1.4

git服务器的搭建

WS:添加apt的163源

这里的源是163提供的给Debian 8(Jessie)的源,你可以自己去寻找适合自己版本的163源清华大学镜像站源等等。

shell
vi /etc/apt/sources.list

加入:

yaml
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib

WS:root用户下安装git和sudo

shell
apt-get install git
apt-get install sudo

WS:root用户下添加用于git的用户

shell
adduser bwb

fa368cfc852775d15feeb737f4c57d7a.png 密码一定要输哦,这个密码是登录这个账户的密码。

WS:root用户下给bwb用户sudo权限

shell
vi /etc/sudoers

添加:

shell
bwb     ALL=(ALL:ALL) ALL

并使用wq!进行强制保存。

DS:创建ssh的密钥

shell
cd ~/.ssh
ssh-keygen -t rsa

会提示输入密码,这个密码是这个密钥的密码,推荐输入哦(虽然不输入也能成功)。如果没有.ssh目录的话,可以手动创建一个。

DS→WS:拷贝id_rsa.pub

可以使用类似xftp4这类ftp工具,把生成的id_rsa.pub从DS拷贝到WS上。如果使用xftp4的话,注意通过菜单栏的工具选项,勾选“显示隐藏的文件”来看到.ssh这个隐藏目录。 7ff39d86e7dc78004722dfe5441ad00e.png

WS:配置好ssh

从root用户进入(或者直接从bwb用户进入):

shell
su bwb
sudo mkdir ~/.ssh
sudo cd ~/.ssh
sudo cat id_rsa.pub >> authorized_keys
sudo service ssh restart
  • 如果没有.ssh才创建.ssh
  • 这里的id_rsa.pub注意填为你拷贝的文件路径。
  • 配置好后,你可以在DS上通过:
shell
touch test.txt
scp -r test.txt bwb@xxx.xxx.xxx.xxx:/home/bwb

来观察test.txt有没有拷贝到WS上的/home/bwb目录下。这里的xxx.xxx.xxx.xxx是WS的IP,当然你也可以填网址域名。

WS:bwb用户下配置git服务器

我们全程假设web工程的目录为/home/testweb

  1. 进入目录
shell
cd /home/testweb
  1. 初始化空仓库
shell
git init

会提示:初始化空的 Git 版本库于 /home/testweb/.git/

  1. 修改config
shell
vi .git/config

加入:

ini
[receive]
        denyCurrentBranch = ignore
  1. 修改hook 新建一个hook
shell
vi .git/hooks/post-receive

加入:

shell
#!/bin/sh
GIT_WORK_TREE=/home/testweb  git checkout -f
  1. 加入README.md
shell
touch README.md
  1. 加入工程下的所有的文件到git
shell
git add .
  1. 提交到本地仓库
shell
git commit -m "Initial commit"

DS:配置本地git

  1. 安装环境

和前面配置源、安装git的操作一致,只需要这两步就可以了。

  1. 克隆项目
shell
git clone bwb@xxx.xxx.xxx.xxx:/home/testweb

会提示输入密码,这是之前设置的id_rsa的密码。

  1. [可选] 创建robot.txt禁止爬取所有文件:
shell
vi robot.txt

加入:

yaml
User-agent: *
Disallow: /
  1. [可选] 创建不想被上传的文件的规则:
shell
vi .gitignore

加入:

yaml
#self
/.gitignore
 
#robot
robot.txt
  1. 测试是否成功
shell
echo "123" >> README.md
git add .
git status
git commit -m "test"
git push

git status是在提交前查看一下要提交的有哪些东西,可以不用这条命令。

限制bwb账户的权限

如果前面的成功了,基本就搭建完了。这里只是为了更安全限制bwb的权限,只能git,不能登录,且不能用sudo提权了:

  1. 修改shell权限
shell
vi /etc/passwd
bwb:x:1000:1000:,,,:/home/bwb:/bin/bash
bwb:x:1000:1000:,,,:/home/bwb:/usr/bin/git-shell
  1. 修改sudo权限
shell
vi /etc/sudoers
bwb     ALL=(ALL:ALL) ALL
#bwb     ALL=(ALL:ALL) ALL

注意使用wq!强制保存,恭喜你,搭建完成了~

附录:相关问题解决参考

为什么WS在config里面加denyCurrentBranch = ignore?

因为如果不加的话,DS进行push就会报错,大意是它不是个裸仓库:

shell
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

为什么WS要加那个hook?

因为如果不加hook的话,DS进行push,WS是看不到结果的,因为没有更新worktree。你用在WS上使用git status就能看出区别了,它一直停留在master分支上。解决方法是手动更新:

shell
git reset --hard

但是这样太麻烦了,所以加hook,加了的话,就会自动更新,hook的意思就是“if做了什么操作,then就去做什么操作”,它帮你完成了。

为什么不使用git init --bare?

这是一个我研究了好久并且实践过的问题,答案是,--bare不适合web代码管理。

  1. 外观 首先来看一下 git init --bare(以下简称bare)和git init(以下简称init)的外观区别:
  • init会创建一个.git的隐藏文件夹,内容有branches、config、description、HEAD、hooks、info、objects、refs
  • bare不会创建.git文件夹,而是直接在当前文件夹下创建同样的这些内容
  1. 功能
  • init可以在git服务器上执行git操作
  • bare不能在git服务器上执行git操作,会报错:This operation must be run in a work tree
  1. 本质
  • init的本质是会创建工作目录
  • bare的本质是只记录历史信息,不维护工作目录

因此,init适合于web项目的维护,可以在WS上实时地看到更新后的完整的web项目文件。而bare适合于多人的项目维护,不需要在远端仓库看到更新后的工作目录,只需要记录每个人操作了些什么东西即可。如果用bare维护web项目,DS进行push后,WS是没有任何反应的(当然会更新objects文件,只是其他文件没有反应),并且不能在WS上执行任何git操作。所以应该使用init。

我更新了.gitignore,该怎么让它重新生效

shell
git add . //重新提交 .ignore文件
git rm -r --cached . //清空缓存
git add . //重新提交 所有文件
git commit -m "update .gitignore"
git push

我错误地创建了新用户,该怎么撤销?

shell
userdel -r bwb # bwb为你不想创建的用户

git clone的时候提示失败:Host key verification failed

text
Are you sure you want to continue connecting (yes/no)?
Host key verification failed.
fatal: Could not read from remote repository.

这是因为你输入的是回车而不是“yes”,输入yes即可。

Please tell me who you are?

跟着提示设置一下config即可:

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

它的实质是去修改.git/config文件。

ssh连接提示Permission denied (publickey)?

首先检查你是否有那个文件的权限(比如它是root用户才能访问的文件夹),如果没有请赋予权限:

shell
chown -R bwb:bwb home/testweb

然后检查是否把DS的id_rsa.pub的内容成功添加进WS的authorized_keys了。

最后非常可能的就是你配错了用户。比如你把DS的id_rsa.pub配到WS的root用户的authorized_keys里去了,结果后面访问的ssh又是bwb用户,当然被拒绝了。

如果还不行,debian操作系统可以查看/var/log/auth.log,其他操作系统可以查看/var/log/secure,然后:

shell
tail -n100 /var/log/auth.log|grep sshd

来观察到底有没有进行过连接、到底是哪个地方出了问题。

.gitignore的常见语法

yaml
#忽略文件
test.txt
 
#忽略根目录下的文件
/test.txt
 
#忽略指定目录下的文件
/src/test.txt
 
#忽略目录
/test
 
#忽略文件夹,但不忽略其中的某些文件
/test
!/test/test.txt

robot.txt常见语法

最简单的配置:

yaml
User-agent: * # 这里的*代表的所有的搜索引擎种类,*是一个通配符
Disallow: /   # 这里定义是禁止爬寻站点所有的内容
转载请注明出处https://bananaoven.com/articles/210.html | 香蕉微波炉
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。