阅读本文前你必须预先装好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


运行以下命令:
cdfcgiwrap
autoreconf -i
Configure
Make
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文件


$projectroot = "/home/git/repositories";

@git_base_url_list= ("git://192.168.0.101","http://192.168.0.101:81");
$git_temp = "/tmp";
$home_text = "indextext.html";
@stylesheets = ("gitweb.css");
$javascript = "gitweb.js";
@diff_opts = ();
$feature{pathinfo}{default} = [1];
$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文件


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


以上是原来文件的内容

修改后的内容如下显示,注意 红色加粗部分:

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

FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
FCGI_USER=Nginx
FCGI_GROUP=Nginx
FCGI_EXTRA_OPTIONS="-M 0700"
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


chkconfig --levels 2345 spawn-fcgi on
/etc/init.d/spawn-fcgi start


把spawn-fcgi设为开机启动,并启动该服务,该服务成功启动后会在:

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




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


useradd gitpasswd git
su git #切换到git用户
mkdir repositories #会在/home/git目录下建立repositories目录

#开始建立git的root repositories
mkdir /home/git/.ssh
cd /home/git/.sshssh-keygen -t rsa
git gitosis-init < ~/.ssh/id_rsa.pub

以上做的事情就是:


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


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


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


配置GIT服务器-建子项目


我们新建一个用户,用这个用户来进行GIT子项目的推和拉。

su git
cd repositories
mkdir hello.git
cd hello.git
git --bare init
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子项目的推和拉。

useradd ymk
passwd ymk
cd /home/ymk
mkdir git_repo
cd git_repo
mkdir hello.git
cd hello.git
git init


上面就在“客户端 ”初始化好了一个workspace了,此时我们可以进行“远程GIT服务”的推拉了。

touch readme #新建一个readme文本文件
vi readme #随便在此文件中写点什么然后保存退出即可
git add . 代表把当前目录内所有东西进行远程推送
git commit -a -m “init helloworld“ #代表commit所有之前add过的小编,并且带上commit时的注释
git remote add origin git@192.168.1.101:/home/git/repositories/hello.git #建立远程GIT连接
git push origin master #正式推送

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


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


在Nginx的Nginx.conf文件中进行修改(/usr/local/Nginx/Nginx.conf)

server {
  	error_log logs/git.error.log;
    	access_log logs/git.access.log;
    	listen       81;
    	server_name  192.168.0.101;
	index       gitweb.cgi;
    	root /home/git;
location ~ \.(cgi|pl).*$ {
    		gzip off;
   		fastcgi_pass unix:/var/run/fcgiwrap.socket;
    		fastcgi_param  SCRIPT_FILENAME    /home/git/gitweb.cgi;  
        	                          fastcgi_param  SCRIPT_NAME        gitweb.cgi;  
    		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    		include fastcgi_params;
}
 location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
        	root /home/git;
}
location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
       	 	root /home/git;
        	                          fastcgi_param QUERY_STRING $query_string;
		fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
		fastcgi_param GIT_HTTP_EXPORT_ALL true;
		fastcgi_param GIT_PROJECT_ROOT /home/git/repositories;
		fastcgi_param PATH_INFO $uri;
 		include fastcgi_params;
		fastcgi_pass unix:/var/run/fcgiwrap.socket;        	
}
try_files $uri @gitweb;
    		location @gitweb {
        	fastcgi_pass unix:/var/run/fcgiwrap.socket;
        	fastcgi_param SCRIPT_FILENAME /var/www/git/gitweb.cgi;
        	fastcgi_param PATH_INFO $uri;
       	 fastcgi_param GITWEB_CONfig /etc/gitweb.conf;
        	include fastcgi_params;
    }

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

server {
  	error_log logs/git.error.log;
    	access_log logs/git.access.log;
    	listen       81;
    	server_name  192.168.0.101;
	index       gitweb.cgi;
    	root /home/git;

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

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

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

location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
       	 	root /home/git;
        	                          fastcgi_param QUERY_STRING $query_string;
		fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
		fastcgi_param GIT_HTTP_EXPORT_ALL true;
		fastcgi_param GIT_PROJECT_ROOT /home/git/repositories;
		fastcgi_param PATH_INFO $uri;
 		include fastcgi_params;
		fastcgi_pass unix:/var/run/fcgiwrap.socket;        	
}
try_files $uri @gitweb;
    		location @gitweb {
        	fastcgi_pass unix:/var/run/fcgiwrap.socket;
        	fastcgi_param SCRIPT_FILENAME /var/www/git/gitweb.cgi;
        	fastcgi_param PATH_INFO $uri;
       	 fastcgi_param GITWEB_CONfig /etc/gitweb.conf;
        	include fastcgi_params;
}

以上两段做了这么两件事 :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这样的错误,解决办法是:

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

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




一切准备就绪后,启动Nginx。

cd /usr/local/Nginx
./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. ios – Xcode警告:“没有处理文件的规则”和“找不到目录”

    重命名我的项目文件夹后,我收到以下错误消息:什么可能出错?解决方法关于第一个警告,您可以在项目设置中的“构建阶段”中检查XCode,即头文件不会出现在“编译源”列表中.

  2. 你如何将xcode项目转换为cocoapod?

    我有一段代码,我发现我在多个不同的项目中重复使用,所以我想把它变成一个cocoapod并使用私人cocoapod仓库.我的问题是如何将xcode项目设置为cocoapod?它应该是一个静态库还是一个带有appdelegate的空“项目”?

  3. ios – 如何将文件添加到主包的/ Library / Sounds目录中?

    根据Apple’sdocumentation,/Library/Sounds中的声音文件将在尝试播放声音时由系统搜索.如何将声音文件添加到此文件夹?适用于iOS的正确文档应为here总之,您只需将声音文件作为应用程序包的非本地化资源添加到项目中.

  4. ios – 资产目录与文件夹参考:何时使用其中一个?

    我可以将文件放入Assets.xcassets,或者我可以将文件放入文件夹引用.我何时会选择一个而不是另一个?

  5. ios – 从icloud备份中限制sqlite-wal和sqlite-shm

    我是第一次使用coredata,我必须从文档目录中的iCloud备份限制sqlitedb文件,我使用下面的代码完成了它//阻止iCloud备份文档目录文件夹现在我不明白的是,我们还需要从icloud备份中限制sqlite-wal和sqlite-shm文件,如果是,那么如何从icloud备份限制sqlite-wal和sqlite-shm文件我想要一个解决方案,而无需从文档目录文件夹中更改sqlitedb位置…

  6. 在Xcode中安装的git中禁用osxkeychain凭证帮助程序

    解决方法如果您的问题主要关注的是安全性,并且您希望每次都输入密码,那么我会接受钥匙串以适应您的目标>进入osx钥匙串应用程序,>如果您使用的是https,请查找服务器名称>通过单击更改其设置,并在选项卡“访问控制”标记“询问钥匙串密码”下>如果需要,请从列入白名单的应用程序列表中删除git-credential-osxkeychain应用程序.请注意,在Linux上,默认行为也是自动发送凭据.

  7. iOS:如何从文档目录中删除具有特定扩展名的所有现有文件?

    当我更新我的iOS应用程序时,我想删除Documents目录中的任何现有sqlite数据库.现在,在应用程序更新时,我将数据库从软件包复制到文档目录,并通过附加软件包版本来命名它.因此,在更新时,我还想删除可能存在的任何旧版本.我只是希望能够删除所有sqlite文件,而无需循环浏览并查找以前版本的文件.是否有任何方法可以对removeFileAtPath:方法进行通配符?解决方法那么,你想要删除所有*.sqlite文件?

  8. ios – Xcode Server 4.0 git从构建触发脚本推送

    我为一个托管在github上的项目安装了一个XcodeBot.我按照步骤和设置机器人来使用我现有的SSH密钥.验证成功,项目结算和建立.然后,我在预触发器操作中添加了一个shell脚本,它增加了plist中的版本,将其标记,并将该更改提交到github.但是当我尝试从shell脚本执行gitpush时,我得到:–推送到git@github.com:spex-app/spex-ios.git权限被拒

  9. .dylib在Debug中链接,在XCode中找不到适用于iPhone的版本

    所以我已经将libxml2.2.dylib库包含在我的iPhoneXCode项目中,以创建一些Xml和XPath解析实用程序.当我编译并运行在模拟器和设备的调试模式时,我没有问题,但是,当我切换到发布模式我得到…

  10. xcode – 为什么Jenkins在我的Mac上运行不会连接到本地的git repo?

    我正在尝试使用Jenkins实现自动化构建,用于我的iOS项目.我添加了Git插件,但是一旦我尝试将git的URL放在项目的git配置中,它会在下面的屏幕截图中显示错误.这里Jenkins不能从repo克隆到其工作空间.解决方法在大多数情况下,gitbarerepo有扩展名.git我的意思是(其他)/test1看起来不正确,我认为应该是(其他)/test1.git在我的mac上有同样的错误.

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部