使用Smart HTTP和Gitweb搭建简易个人git服务器

原文地址:http://particle128.com/posts/2014/12/git-server.html


使用Smart HTTP的git服务器搭建过程


刚接手了老师的一个安卓项目,考虑到实验室闲置了一台PC,决定把这个pc配置成git服务器,用来进行版本控制。以为是分分钟钟的事儿呢,结果用了一整天才搞定。被网上残缺不全的新旧教程整懵了,决定自己写一个。

协议选择

git可以使用五种网络协议进行通信:

  1. Local:团队成员用不同账户登录同一台电脑,或者共享一个挂载的NFS
    语法:git clone /opt/git/project.git 或 git clone file:///opt/git/project.git
    前者根据是否在同一个文件系统,选择硬链接或拷贝。后者类似网络传输,效率稍低。
  2. SSH:最常用的方式,使用简单,方便搭建,加密传输+访问认证
    语法:git clone ssh://user@server/project.git 或 git clone user@server:project.git
  3. Git Protocol:最快的方式,但是没有认证功能
  4. HTTP:最兼容的方式,该协议一般不会被防火墙阻隔,有认证没加密
    语法:git clone http://server/project.git
  5. HTTPS:最安全的方式,加密+认证,但效率低(SSL的握手需要6步)
    语法:git clone https://server/project.git

因为学校封SSH的22端口,而且有一个同学在校外,排除了SSH协议。HTTPS协议太慢,我们的项目不需要加密数据,排除。GIT协议连认证都没有,太过简陋,排除。不同账户登录一台pc机远程办公,丧失了git作为分布式版本控制系统的优势,排除。

最终,我决定用HTTP协议。用HTTP协议也有两种方式:

  1. dumb http
  2. smart http

区别是,dumb http模式中,如果get请求的文件在packfile中,只能请求整个packfile,即使你需要的只有其中的一个文件。另外一方面,smart http模式中,在http服务器后面,又加了一层CGI,叫git-http-backend,它会像git或ssh协议那样,当请求到来后,把需要的文件,从各个packfile中抽取,然后组成一个自定义packfile后再传给客户端。

故选择Smart HTTP。既然都用HTTP协议了,干脆把gitweb也配出来,方便通过浏览器查看git的版本库。下面是配置过程。

配置过程

1、软硬件环境
  • Pentium Dual-Core CPU,32 bits
  • ubuntu 12.04 LTS
  • apache 2.4.7
  • git 1.9.1

apache2、git、gitweb的安装:

apt-get install git
apt-get install gitweb
apt-get install apache2

2、创建git库

我选择在/srv/目录下创建一个bare repo,叫test.git,并把该目录下所有文件的所有者和组都改成www-data(apache2的默认所有者和默认组),以便apache2有权限访问它。

cd /srv
git init --bare test.git
chown -R www-data:www-data test.git
3、配置apache2

apache2的总配置文件是/etc/apache2/apache2.conf,它会读取/etc/apache2/sites-enabled/下的配置文件。而该目录下的文件,一般是/etc/apache2/sites-available/下配置文件的软链接。

打开/etc/apache2/apache2.conf,在最后添加如下内容。每条命令的解释,见注释。

# 默认apache2只对两个目录(/usr/share和/var/www)有访问权限,如下指令赋予apache2对/srv的访问权限。
<Directory /srv/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

# 如果没有这句,在其他机器上执行git clone等命令会返回403错误,参照最后一条“参考”
<Location />
    Options +ExecCGI
    Require all granted
</Location>

# 设置git的工程目录
SetEnv GIT_PROJECT_ROOT /srv/
# 默认情况下,含有git-daemon-export-ok文件的目录才可以被导出(用作git库目录)。设置这个环境变量以便所有目录都可以被导出
SetEnv GIT_HTTP_EXPORT_ALL

# 虚拟主机,匹配80端口的任何ip地址的请求,访问gitweb
<virtualhost *:80>
    # 顺便在/etc/hosts里添加上一句:127.0.0.1 git.example.com。这样,在服务器上可以通过该名字访问这个页面
    ServerName git.example.com
    DocumentRoot /usr/share/gitweb
    ErrorLog ${APACHE_LOG_DIR}/git_error.log
    CustomLog ${APACHE_LOG_DIR}/git_access.log combined
</virtualhost>

# gitweb目录添加ExecCGI的功能
<Directory /usr/share/gitweb>
    Options FollowSymLinks ExecCGI
    AddHandler cgi-script .cgi
    DirectoryIndex gitweb.cgi
</Directory>

# 对git库的各种请求,执行git-http-backend.cgi
ScriptAliasMatch \
    "(?x)^/(.*/(HEAD | \
    info/refs | \
    objects/(info/[^/]+ | \
     [0-9a-f]{2}/[0-9a-f]{38} | \
     pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
    git-(upload|receive)-pack))$" \
    /usr/lib/git-core/git-http-backend/$1
# 其余的请求,执行gitweb.cgi
ScriptAlias / /usr/share/gitweb/gitweb.cgi

# 设置git push等操作的认证方式为文件认证,/var/www/git-auth后面会创建。
<LocationMatch "^/.*/git-receive-pack$">
    AuthType Basic
    AuthName "Git Access"
    Require valid-user
    AuthBasicProvider file
    AuthUserfile /var/www/git-auth
</LocationMatch>

4、push操作的认证

默认git-http-backend的upload-pack是被置为真的,即可以执行git clone/pull/fetch。但是,默认receive-pack是被置为false,即不能git push。为了支持带认证的git push,需要两步操作。

第一步,打开/srv/test.git/config,添加如下内容:

[http]
    receivepack = true

如果不加上面这句,git clone下来的版本库,git push时会提示403错误,即没有授权。

第二步,生成一个包含用户名和密码的文件,该文件能被apache2读取,作为文件认证的依据。假设我要添加两个用户mashu和ouyang,密码在提示下输入,我要执行如下命令:

cd /var/www
htpasswd -c git-auth mashu
htpasswd git-auth ouyang 

有了这个文件,添加到上面的apache2的配置文件中即可。

5、gitweb的配置

修改/etc/gitweb.conf中的一句:

$projectroot = "/srv"
6、重启apache2
service apache2 restart

7、客户端检查

在客户端电脑上,找一个目录,执行如下命令

git clone http://server-ip/test.git test-repo
cd test-repo
echo "aaa" > file
git add file && git commit -am "first commit"
git push

然后,在浏览器上输入http://server-ip,查看刚才的操作是否记录到gitweb上了。

参考

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在阿里云服务器上配置Git,您需要按照以下步骤进行操作: 1. 部署Apache服务器使用以下命令安装Apache服务器: ``` sudo apt install apache2 ``` 2. 查找公网IP和重新设置密码: 您可以登录到阿里云控制台,找到您的云服务器实例,并查看其公网IP地址。您还可以在控制台上重新设置密码。 3. SSH到服务器: 在终端中使用以下命令通过SSH连接到您的云服务器: ``` ssh root@公网IP地址 ``` 4. 安装Git: 在SSH连接的终端中,使用以下命令安装Git: ``` apt install git ``` 5. 配置Apache服务器: 打开Apache的配置文件(通常是`/etc/apache2/apache2.conf`),并添加以下内容: ``` Alias /gitweb /var/www/git SetEnv GITWEB_CONFIG /etc/gitweb.conf <Directory /var/www/git> # 配置选项 </Directory> ``` 这些配置指示Apache服务器在接收到`domain-name/gitweb`的请求后,将请求转发到`/var/www/git`目录。同时,`SetEnv GITWEB_CONFIG`指定了GitWeb使用的配置文件路径。 6. 配置GitWeb: 打开GitWeb的配置文件(通常是`/etc/gitweb.conf`),根据您的需求进行配置。在配置文件中,您可以指定版本库的根目录、授权访问等设置。 7. 重启Apache服务器使用以下命令重新启动Apache服务器以使配置生效: ``` systemctl restart apache2 ``` 现在您已经成功地配置了Git服务器,并且可以使用GitWeb界面访问您的版本库。请记住,这只是一个基本的配置示例,您可能需要根据您的特定需求进行进一步的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值