阅读本文前你必须预先装好CentOS并且已经安装和配置好Nginx了。


安装GIT私服套件

  • 安装centos6.5-centos7.0
  • 安装nginx
  • yum install -y?git gitweb spawn-fcgi?fcgi-devel?fcgi

以上步骤执行完毕后,我们安装了:

  • git服务
  • Gitweb,因为git是一个光板,只支持 git clone gituser@hostname:/repositories这样的协议,对于eclipse开发者来说键入一堆的git 命令将会是一个恶梦,因此我们必须有一个图形化的界面并且让git支持http协议来支持我们的“远程协作 ”
  • spawn-fcgi,这个东西特别有意思,因为nginx默认是不支持cgi的,而gitweb是用cgi写的,因此我们才安装fastcgi,而fastcgi又要通过spawn-fcgi来启动。。。因此。。。必须要装spawn-fcgi。
  • fcgi-devel 和 fcgi都属于fastcgi运行时的lib库了

安装fcgiwrap

从以下网址下载该组件:https://codeload.github.com/gnosek/fcgiwrap/legacy.tar.gz/master

运行以下命令:

  1. cd fcgiwrap
  2. autoreconf -
  3. Configure
  4. Make
  5. make install

全部安装完后注意检查以下必要文件是否存在

  • /etc/init.d 目录下有一个spawn-fcgi程序
  • /usr/bin 目录下有一个spawn-fcgi程序
  • /var/www/git目录下是gitweb所有的文件(网页版git)
  • /etc/目录下有一个gitweb.conf文件
  • /etc/sysconfig/目录下有一个spawn-fcgi文件

开始配置GIT私服-修改/etc/gitweb.conf文件

  1. $projectroot = "/home/git/repositories";
  2.  
  3. @git_base_url_list= ("git://192.168.0.101", "http://192.168.0.101:81");
  4. $git_temp = "/tmp";
  5. $home_text = "indextext.html";
  6. @stylesheets = ("gitweb.css");
  7. $javascript = "gitweb.js";
  8. @diff_opts = ();
  9. $feature{pathinfo}{default} = [1];
  10. $feature{'highlight'}{'default'} = [1];
以上配置做了这么几件事:
  • 所有的git的子项目:如“hello.git”全部位于/home/git/repositories目录下
  • Git的常用两种协议对外暴露的URL:
  1. 一个使用的是git协议
  2. 一个使用的是http协议,并且它的端口号为81
  • @feature是gitweb的属性,它告诉gitweb可以如:代码高亮,路径信息等,gitweb中还有许多功能强大的@feature

开始配置GIT私服-修改/etc/sysconfig/spawn-fcgi文件

  1. # You must set some working options before the "spawn-fcgi" service will work.
  2. # If SOCKET points to a file, then this file is cleaned up by the init script.
  3. #
  4. # See spawn-fcgi(1) for all possible options.
  5. #
  6. # Example :
  7. #SOCKET=/var/run/php-fcgi.sock
  8. #OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"

以上是原来文件的内容

修改后的内容如下显示,注意红色加粗部分:
  1. # You must set some working options before the "spawn-fcgi" service will work.
  2. # If SOCKET points to a file, then this file is cleaned up by the init script.
  3. #
  4. # See spawn-fcgi(1) for all possible options.
  5. #
  6. # Example :
  7. #SOCKET=/var/run/php-fcgi.sock
  8. #OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"
  9.  
  10. FCGI_SOCKET=/var/run/fcgiwrap.socket
  11. FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
  12. FCGI_USER=nginx
  13. FCGI_GROUP=nginx
  14. FCGI_EXTRA_OPTIONS="-M 0700"
  15. OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"

启动spawn-fcgi

  1. chkconfig --levels 2345 spawn-fcgi on
  2. /etc/init.d/spawn-fcgi start
把spawn-fcgi设为开机启动,并启动该服务,该服务成功启动后会在:

/var/run目录下生成一个fcgiwrap.socket文件。

配置GIT服务器-初始化GIT服务

  1. useradd gitpasswd git
  2. su git #切换到git用户
  3. mkdir repositories #会在/home/git目录下建立repositories目录
  4.  
  5. #开始建立git的root repositories
  6. mkdir /home/git/.ssh
  7. cd /home/git/.sshssh-keygen -t rsa
  8. git gitosis-init < ~/.ssh/id_rsa.pub

以上做的事情就是:

1. 生成的gitosis-admin为Git的用户访问权限管理库,gitosis通过这个git库来管理所有git库的访问权限。

2. 通过执行初始化,该公钥的拥有者就能修改用于配置gitosis的那个特殊Git仓库了

因为git中的密钥就是通过gitosis这个特殊的repo来管理的。有了它我们就可以管理我们的GIT,包括建子项目什么的了。

配置GIT服务器-建子项目

我们新建一个用户,用这个用户来进行GIT子项目的推和拉。
  1. su git
  2. cd repositories
  3. mkdir hello.git
  4. cd hello.git
  5. git --bare init
  6. sudo chmod 777 /home/git/repositories/hello.git R

让这个目录具有读写执行权限,你也可以把权限放的小一些,如chmod +x类似的,只要让这个目录可以有读、写、执行(git特殊的unpack, pack功能)权限就可以了。

以上就是建立了一个GIT子项目,名字叫hello,我们来看看/home/git/repositories下的 hello.git这个项目吧

配置GIT服务器-使用其它用户推拉hello.git

我们新建一个用户,用这个用户来进行GIT子项目的推和拉。
  1. useradd ymk
  2. passwd ymk
  3. cd /home/ymk
  4. mkdir git_repo
  5. cd git_repo
  6. mkdir hello.git
  7. cd hello.git
  8. git init
上面就在“客户端 ”初始化好了一个workspace了,此时我们可以进行“远程GIT服务”的推拉了。
  1. touch readme #新建一个readme文本文件
  2. vi readme #随便在此文件中写点什么然后保存退出即可
  3. git add . 代表把当前目录内所有东西进行远程推送
  4. git commit -a -m init helloworld #代表commit所有之前add过的东东,并且带上commit时的注释
  5. git remote add origin git@192.168.1.101:/home/git/repositories/hello.git #建立远程GIT连接
  6. git push origin master #正式推送

看到一堆推送日志后,并看到OK, SUCCESS字样后即代表push成功了。下面就是要让我们的GIT具有基于http协议进行推送的配置了。

配置GIT服务器-配置GITWEB + NGINX

在nginx的nginx.conf文件中进行修改(/usr/local/nginx/nginx.conf)
  1. server {
  2. error_log logs/git.error.log;
  3. access_log logs/git.access.log;
  4. listen 81;
  5. server_name 192.168.0.101;
  6. index gitweb.cgi;
  7. root /home/git;
  8. location ~ \.(cgi|pl).*$ {
  9. gzip off;
  10. fastcgi_pass unix:/var/run/fcgiwrap.socket;
  11. fastcgi_param SCRIPT_FILENAME /home/git/gitweb.cgi;
  12. fastcgi_param SCRIPT_NAME gitweb.cgi;
  13. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  14. include fastcgi_params;
  15. }
  16. location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
  17. root /home/git;
  18. }
  19. location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
  20. root /home/git;
  21. fastcgi_param QUERY_STRING $query_string;
  22. fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
  23. fastcgi_param GIT_HTTP_EXPORT_ALL true;
  24. fastcgi_param GIT_PROJECT_ROOT /home/git/repositories;
  25. fastcgi_param PATH_INFO $uri;
  26. include fastcgi_params;
  27. fastcgi_pass unix:/var/run/fcgiwrap.socket;
  28. }
  29. try_files $uri @gitweb;
  30. location @gitweb {
  31. fastcgi_pass unix:/var/run/fcgiwrap.socket;
  32. fastcgi_param SCRIPT_FILENAME /var/www/git/gitweb.cgi;
  33. fastcgi_param PATH_INFO $uri;
  34. fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
  35. include fastcgi_params;
  36. }

这么一大陀配置,你可以全部复制、粘贴,因为网上所有GIT WEB的配置,全部是错的,这一陀已经在本地GIT私服上运行起来了,少一行多一行都不行。下面就来做一些核心语句块的解释吧,注意红色加粗部分(我就喜欢粗)

  1. server {
  2. error_log logs/git.error.log;
  3. access_log logs/git.access.log;
  4. listen 81;
  5. server_name 192.168.0.101;
  6. index gitweb.cgi;
  7. root /home/git;

我们把我们的gitweb的http服务申明在了81网段, gitweb的主页叫gitweb.cgi。

  1. location ~ \.(cgi|pl).*$ {
  2. gzip off;
  3. fastcgi_pass unix:/var/run/fcgiwrap.socket;
  4. fastcgi_param SCRIPT_FILENAME /home/git/gitweb.cgi;
  5. fastcgi_param SCRIPT_NAME gitweb.cgi;
  6. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  7. include fastcgi_params;
  8. }
  9. location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
  10. root /home/git;
  11. }

这两段告诉了NG,凡是cgi的去哪里找.cgi文件,一定注意不要漏了include fastcgi_params;这一句,你也可以去/usr/local/nginx下看看,是否有这个文件。

  1. location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
  2. root /home/git;
  3. fastcgi_param QUERY_STRING $query_string;
  4. fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
  5. fastcgi_param GIT_HTTP_EXPORT_ALL true;
  6. fastcgi_param GIT_PROJECT_ROOT /home/git/repositories;
  7. fastcgi_param PATH_INFO $uri;
  8. include fastcgi_params;
  9. fastcgi_pass unix:/var/run/fcgiwrap.socket;
  10. }
  11. try_files $uri @gitweb;
  12. location @gitweb {
  13. fastcgi_pass unix:/var/run/fcgiwrap.socket;
  14. fastcgi_param SCRIPT_FILENAME /var/www/git/gitweb.cgi;
  15. fastcgi_param PATH_INFO $uri;
  16. fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
  17. include fastcgi_params;
  18. }

以上两段做了这么两件事 :git通过http传输时会调用git-upload和git-receive或者是git-pack、git-unpack函数,因此它们会使用到一个git的类库,叫git-http-backend,因此只要url中出现git-pack、git-upload、git-receive之类的函数都会转到git-http-backend去处理。

try_files呢?即除了前面三段定义的客户浏览器端行为,其它未在定义中说明的任何请求全部走try_files段,相当于一个default的关键字。比如说: http://192.168.0.101:81/hello.git 就会被转到try_files段去。

因为在前面三段我们都只是申明客户的何种行为将要去哪找相关的类库,而只有一处就是对于git-upload, git-receive或者是git-pack/unpack的请求,我们会让NG交由git服务端的类库去处理,并未明确告诉*.git和其它的相关的请求由谁处理,因此这边来了一个try_files也是一种“简写”-当然,有更好的更精细的办法来做URL申明,可以自己去练习一下。

NG配置好了后,我们先不要急着启NG。我们先来了解一下GIT基于HTTP推送的相关原理:

客户端通过ECLIPSE的JGIT连上GIT的远程服务后会发送一个git-upload指令。
同时服务端会回一个git-receive给到客户端做“接收”请求的准备,但是git服务默认对于这个receive的值为false,因此如果你没有做特殊处理后,在eclipse连上git后会发生一个can not find git-receive这样的错误,解决办法是:

  1. su git
  2. cd /home/git/repositories/hello.git
  3. git config --file config http.receivepack true

这条命令发送后我们来看一下GIT服务器上的/home/git/repositories/hello.git/config这个文件的内容吧

一切准备就绪后,启动nginx。
  1. cd /usr/local/nginx
  2. ./nginx c /usr/local/nginx/nginx.conf

在客户端用浏览器打开http://192.168.0.101:81网址你会看到这样的画面

客户端使用eclipse访问远程GIT

这时可以commit了-commit在本地的repo里

commit后才是真正的向远程的push

给gitweb加上用户名密码

CentOS环境下使用GIT基于Nginx的私服搭建全过程的更多相关文章

  1. CentOS 环境下基于 Nginx uwsgi 搭建 Django 站点

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,CentOS 环境下基于 Nginx uwsgi 搭建 Django 站点 以下 ...

  2. CentOS 7 下 JDK1.8+Maven+Nginx+MySql+Git+Redis环境安装

    CentOS 7 下 JDK1.8+Maven+Nginx+MySql+Git+Redis环境安装 安装目录准备 新建data目录,用来放下载的软件 mkdir -p /data 切换到该data目录 ...

  3. centos环境下使用percona-xtrabackup对mysql5.6数据库innodb和myisam进行快速备份及恢复

    centos环境下使用percona-xtrabackup对mysql5.6数据库innodb和myisam进行快速备份及恢复 有时候我们会碰到这样的业务场景: 1.将大的数据库恢复到本地进行业务测试 ...

  4. CentOS 7 下安装 LEMP 服务(nginx、MariaDB/MySQL 和 php)

    原文 CentOS 7 下安装 LEMP 服务(nginx.MariaDB/MySQL 和 php) LEMP 组合包是一款日益流行的网站服务组合软件包,在许多生产环境中的核心网站服务上起着强有力的作 ...

  5. Linux/CentOS环境下如何安装和配置PhantomJS工作环境

    PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, C ...

  6. Android 源码获取-----在Windows环境下通过Git得到Android源代码

    在学习Android的过程中,深入其源代码研究对我们来说是非常重要的,这里将介绍如何通过在Windows环境下使用Git来得到我们的Android源代码. 1.首先确保你电脑上安装了Git,这个通过  ...

  7. 使用git推送代码到开源中国以及IDEA环境下使用git

    使用git推送代码到开源中国以及IDEA环境下使用git 在学习Java的过程中我们会使用到git这个工具来将我们本周所编写的代码上传到开源中国进行代码托管,而在使用git的时候有很多的同学由于不会操 ...

  8. Centos环境下部署游戏服务器-软件安装

    这篇文章主要介绍一下游戏服务器需要安装的软件和需要修改的配置.现介绍下项目,本项目服务器端是c++ + mysql组合,客户端是as写的,需要安装的服务为Mysql,Php,Apache, 以及一个n ...

  9. CentOS环境下R语言的安装和配置

    最近在看数据统计和分析,想到了R语言,于是就着手在自己的CentOS环境下进行安装和配置.步骤如下: 1.前往R官网下载安装包. 2.解压压缩包:tar xvzf R-3.2.2.tar.gz 3.进 ...

随机推荐

  1. jquery checkbox radio 标签 选中的3种方法

    张映 发表于 2013-07-16 分类目录: js/jquery 标签:checkbox, jquery, radio, 选中 jquery 很灵活,checkbox radio标签选中的方法有很多 ...

  2. 理解error和exception之间的区别

    很多程序员不清楚error和exception之间的区别,这区别对于如何正确的处理问题而言非常重要(见附1,"简要的叙述error和exception").就像Mary Campi ...

  3. Markdown 编辑器使用指南

    Markdown 编辑器使用指南 1.快捷键 加粗: Ctrl/Cmd + B 标题: Ctrl/Cmd + H 插入链接: Ctrl/Cmd + K 插入代码: Ctrl/Cmd + Shift + ...

  4. 深入理解事件(Event)

    前言 在前一篇文章中讲到了Event 发布与订阅(一) 里面用到了事件来实现一些发布与订阅,当时对事件及其委托理解的还不是太深入,可能在使用上有点捉急.这篇来好好讲讲事件,以及通过一些小DEMO来加深 ...

  5. [JLOI 2015]装备购买

    Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示  (1 <= i <= n; 1 < ...

  6. [ZJOI 2013]丽洁体

    Description 题库链接 给出四个字符串 \(T,A,B,C\) ,问你至少在 \(T\) 串中删去几个单词能使得 \(T\) 串变为 \(A?B?C\) 的形式,其中 \(?\) 表示任意多 ...

  7. [SCOI2016]幸运数字

    题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征. 一些旅行者希望 ...

  8. [HAOI2008]圆上的整点

    题目描述 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. 输入输出格式 输入格式: r 输出格式: 整点个数 输入输出样例 输入样例#1: 4 输出样例#1: 4 说明 n ...

  9. 【HNOI2017】影魔

    题目描述 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄. 每一个灵魂,都有着自 ...

  10. ●BZOJ 2049 [Sdoi2008]Cave洞穴勘测

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2049 题解: LCT入门题 就是判两个点是否在同一颗树里 代码: #include<c ...