一、安装gitweb
sudo apt-get install git git-core gitweb
创建git项目管理文件夹/git
#创建项目管理文件夹
sudo mkdir /git
#设置文件夹用户组为www-data,这点很重要,原因后面会讲
sudo chown yourname:www-data /git
修改git文件夹为/git
sudo gedit /etc/gitweb.conf
#修改git项目存放的文件夹:
# path to git projects (<project>.git)
#$projectroot = "/var/lib/git";
$projectroot = "/git";
...
#开启cgi
sudo a2enmod cgi
访问http://{service}/gitweb即可通过网页游览项目
创建第一个项目
cd /git
git init --bare test.git
二、安装主题
gitweb刚安装上很难看,可以安装漂亮一点的主题美化页面
开源主题:https://github.com/kogakure/gitweb-theme
在git服务器上将这个开源项目克隆下来,根据readme说明执行:
sudo ./setup -vi --install
三、配置路由
使用http://{service}/gitweb的形式访问git服务器不方便,我们需要访问制定站点直接使用,例如:http://git.service.com
方案一:http://git.service.com自动跳转到http://git.service.com/gitweb
#编辑Apache配置
sudo vim /etc/apache2/sites-enabled/000-default.conf
#插入下列配置
<VirtualHost *:80>
ServerName git.service.com
ServerAlias git
DocumentRoot /git
SetEnv GITWEB_CONFIG /etc/gitweb.conf
RewriteEngine on
RewriteRule ^/$ /gitweb [PT]
RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ /gitweb%{REQUEST_URI} [L,PT]
# Aliases
#ScriptAlias /gitweb /usr/lib/cgi-bin/gitweb.cgi
#Alias /gitweb.css /usr/share/gitweb/gitweb.css
#Alias /git-logo.png /usr/share/gitweb/git-logo.png
#Alias /git-favicon.png /usr/share/gitweb/git-favicon.png
# Logfiles
ErrorLog /var/log/apache2/gitweb.error.log
CustomLog /var/log/apache2/gitweb.access.log combined
</VirtualHost>
方案二:以http://git.service.com直接访问(推荐)
#<IfModule mod_ssl.c> #开启ssl时开启
<VirtualHost *:80> #开启ssl时改为443
ServerName git.service.com
DocumentRoot /usr/share/gitweb
# Deny to access to .htaccess etc
<Files ~ "(^\.htaccess|^.*\.conf)">
Order allow,deny
Deny from all
</Files>
# OPTIONAL: Completely deny pushing over HTTP
# <LocationMatch "git-receive-pack">
# Order Allow,Deny
# Deny from all
# </LocationMatch>
<Directory /usr/share/gitweb>
Options ExecCGI FollowSymLinks
Order allow,deny
Allow from all
</Directory>
<Location />
AuthType Basic
AuthName "Git Repositories"
AuthUserFile /git/git-auth
#Require valid-user #开启登录用户验证时开启
Order allow,deny
Allow from all
</Location>
Options ExecCGI FollowSymLinks
AddHandler cgi-script cgi
SetEnv GIT_PROJECT_ROOT /git
SetEnv GIT_HTTP_EXPORT_ALL
# Note: Serve static files directly
AliasMatch ^/static/(.*)$ /usr/share/gitweb/static/$1
AliasMatch ^/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$ /git/$1
AliasMatch ^/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /git/$1
# Note: Serve repository objects with Git HTTP backend
ScriptAliasMatch \
"(?x)^/(.*/(HEAD | \
info/refs | \
objects/info/[^/]+ | \
git-(upload|receive)-pack))$" \
/usr/lib/git-core/git-http-backend/$1
ScriptAlias / /usr/share/gitweb/gitweb.cgi
RewriteEngine on
RewriteRule ^/$ /usr/share/gitweb/gitweb.cgi [L]
RewriteRule ^/(\w+\.git)$ /?p=$1 [R]
ErrorLog ${APACHE_LOG_DIR}/git_error.log
CustomLog ${APACHE_LOG_DIR}/git_access.log combined
#开启ssl时开启,git.service.com改为秘钥所在文件夹,git.service.com或service.com都有可能
#SSLCertificateFile /etc/letsencrypt/live/git.service.com/fullchain.pem
#SSLCertificateKeyFile /etc/letsencrypt/live/git.service.com/privkey.pem
#Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
#</IfModule>
三、网页访问开启用户登录验证
按方案二配置,开启 Require valid-user,重启apache
#进入目录
cd /git
#创建用户登录信息文件
touch git-auth
#新增用户登录信息
sudo htpasswd /git/git-auth username
#根据提示输入两次密码
到这里git服务器已经搭建好,可以做如下访问
web: http://git.vc800.com
git: http://git.vc800.com/test.git
四、网站加密ssl
上一步访问网站,登录用的账户密码是明文传输到服务器,安全性不高,可以安装ssl证书来提高安全性。
可以使用开源免费的第三方ssl证书服务Let's Encrypt
参考网址:
如何使用Ubuntu 16.04上的Let加密保护Apache
Let’s Encrypt配置免费SSL证书建立HTTPS(Ubuntu+Apache)
五、第一个项目test
1.创建第一个项目test
cd /git
#在服务器上创建项目一定要加--bare参数,这样创建的项目只包含.git文件夹下的文件
#即只包含项目提交信息,而不包含项目文件
#这样可以避免在服务器上可以像在本地一样操作项目文件
#从而避免在本地提交master分支修改,同时服务器上有人修改master引起的提交出错
#尤其是团队写作项目更需要注意这点
git init --bare test.git
2.本地拉取服务器上的项目
git clone https://git.ljyme.com/test.git
#会有如下提示:
正克隆到 'test'...
warning: 您似乎克隆了一个空仓库。
#但不要紧,这本就是一个空仓库
3.本地修改项目文件推送到服务器
cd test #进入项目
echo "hellow world!">index.html #创建文件并写入内容
git add * #将修改添加到暂存区
git commit -m "add" #将更改记录(提交)到存储库
git push #将修改推送到服务器
注意:
如果你在创建/git文件夹时没有修改用户组,在推送代码时可能会有如下报错:
~$ git push
对象计数中: 3, 完成.
写入对象中: 100% (3/3), 219 bytes | 219.00 KiB/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects
remote: fatal: failed to write object
error: 远程解包失败:unpack-objects abnormal exit
To http://git.service.com/test.git
! [remote rejected] master -> master (unpacker error)
error: 无法推送一些引用到 'https://git.service.com/test.git'
这是因为服务器上的test项目文件夹没有写入权限的原因
#使用chown命令修改文件夹及子文件(夹)用户组
sudo chown -R yourname:www-data test.git
#结果:
drwxrwxr-x 7 yourname www-data 4096 Oct 12 00:22 test.git/
#为了一捞永益的解决这个问题,可以直接修改git文件夹的用户组
sudo chown -R yourname:www-data /git
六、免密码使用ssh
在客户端上正常使用git的clone、push和pull功能时,需要每次输入服务端的密码(git是使用ssh协议传输数据的),这里有两种方式实现免密码。
方案一:使用.netrc文件实现免输入密码(简单)
cd ~
touch .netrc
vim .netrc
#插入下列登录信息,保存即可
machine git.service.com
login yourname
password yourpassowrd
#window用户请到C:Users/your_pc_username下创建_netrc文件夹并添加登录信息
#.netrc方法实际上是以ftp形式登录服务器下载文件的
方案二:使用ssh公钥验证(麻烦一点)
在服务器端设置了客户端的ssh公钥,可以免密码在客户机上使用git(注意,与第三步的gitweb网页用户名和密码没有任何关系)
1、在客户端生成rsa公钥:
ssh-keygen -t rsa -C "<你的邮箱地址>"
这里的邮箱地址可以随意输入,和~/.gitconfig文件中设置的邮箱没有任何关系,也不影响免密功能。
一路回车键确定后,会在~/.ssh目录下生成id_rsa、id_rsa.pub文件,这个id_rsa.pub文件即为公钥。
2、复制id_rsa.pub文件中的内容,将其粘贴到服务器端~/.ssh/authorized_keys文件中。若不存在这个文件,则使用vi编辑器新建并粘贴客户端公钥,多个客户端公钥请使用换行隔开。之后使用git将不再提示输入密码了。
3、删除服务器端authorized_keys文件中的某客户机ssh公钥后,该客户机可能也无法直接使用ssh用户名和密码来操作git,这时候只需要删除客户机端的~/.ssh/known_hosts文件即可正常使用ssh用户名密码了。
4.这时候clone服务器项目的地址有所改变
git clone yourname@git.service.com:/git/test.git
#yourname是服务器登录名
参考网址:
GitWeb学习笔记:https://blog.csdn.net/fromcaolei/article/details/78530059?locationNum=4&fps=1