Ubuntu和centos下搭建自己的git服务器

远程仓库使用了 Github,Github 公开的项目是免费的,但是如果你不想让其他人看到你的项目就需要收费。不想缴费,这时我们就需要自己搭建一台Git服务器作为私有仓库使用。


  • Ubuntu下搭建git服务器

  1. 查看git版本,一般Ubuntu和centos安装系统的时候会自动安装
 $ git --version  
git version 1.7.1 
  1. 如果未安装,用命令sudo apt-get install git安装
 $ sudo apt-get install git
  1. 我们最好为其配置一个专门的git用户并设置密码,专门对代码进行管理和管理git服务
  sudo useradd -m git  
 sudo passwd git(change to yours)  

说明:上述命令生成一个用户名与密码均为git的账户,你也可以设置你的密码,这里要先设置好,不然后面会出现问题,(如果没有设置密码,也没有ssh-key时,就无法验证,无法clone)也可以自己创建别的用户名只要进行相关操作(比如clone,push,pull)时指定用户名即可(本文章一律以git为例),-m 选项是让其在home目录下生成用户的主文件夹,我们的代码仓库会布置在这个主文件夹下。

  1. 然后,在新建的git用户主目录下创建一个文件夹repositories 作为git的仓库,并为这个仓库配备最基本的安防——权限控制
  sudo mkdir /home/git/repositories # 最好使用repositories作为文件夹名称,这样可以简化后面的操作  
sudo chown git:git /home/git/repositories  
sudo chmod 755 /home/git/repositories  
  1. 至此,一个简单的git服务器已经搭建好了,可以自己创建一个简单的工程测试一下。为了方便后面的操作,我们先切换到git用户下
  su git
  1. 在respositories下新建一个目录helloworld(仓库),并切换到这个目录,在此处初始化这个空的仓库
 mkdir helloworld  
cd helloworld 
git --bare init  

在这里要注意下,我们初始化仓库的时候,最好用git –bare init
这条命令,可以省去很多麻烦,而不要使用:git init 关于这两条命令的区别请看我的另一篇博客:http://blog.csdn.net/qq_29232943/article/details/60971061

如果使用了git init初始化,则远程仓库的目录下也包含work tree。
当本地仓库向远程仓库push时,如果远程仓库正在push的分支上(如果当时不在push的分支,就没有问题), 那么push后的结果不会反应在work tree上,也即在远程仓库的目录下对应的文件还是之前的内容。
解决方法:服务器端必须运行命令:git reset –hard才能看到push后的内容。

出现问题2
Git: push 出错的解决 master -> master (branch is currently checked out)

这是由于git默认拒绝了push操作,需要进行设置,修改服务器端的.git/config添加如下代码:

[receive]
denyCurrentBranch = ignore

ok,一个空的仓库建立好了,用另外一台安装了git的机器(比如你的开发机windows)测试一下,通过ifconfig -a命令查看你git服务器的IP地址,要分清你的IP地址,你的服务器连得是有线网络则IP为eth0 的inter地址,若是无线网络则是wlan0的inet的地址,此处假设你上面所用的服务器IP为192.168.8.34

 $ git clone git@192.168.8.34:/home/git/repositories/helloworld
Cloning into 'helloworld'...
The authenticity of host '192.168.8.34 (192.168.8.34)' can't be established.
RSA key fingerprint is 2b:55:45:e7:4c:29:cc:05:33:78:03:bd:a8:cd:08:9d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.8.34' (RSA) to the list of known hosts.
[email protected]'s password:  

说明:这里两点需要注意:
第一,当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:

The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?

这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器(就是你的ssh-key,公钥要上传到服务器上,私钥在本地,当第一次clone是要验证这个信息,验证成功后,会生成一个known_hosts文件,里面是你的连接信息,以后就不用验证了),输入yes回车即可。Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:

Warning: Permanently added 'github.com' (RSA) to the list of known hosts.

这个警告只会出现一次,后面的操作就不会有任何警告了。
如果你实在担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。

第二,这里提示你输入密码才能clone,当然如果你知道密码,可以键入密码来进行clone,但是更为常见的方式,是利用SSH的公钥来完成验证。


在开发机上进行一些基本操作测试:为这个项目add一些文件,然后commit,然后push,如果除了要几次输入git用户的密码外,其他一切正常的话,那说明上面的安装与配置就已经成功了。

在上面的测试过程中,是不是发现那个clone的路径好长,很容易错?几个步骤都需要输入git用户的密码(clone、push),是不是很烦,而且照这个节奏,每增加一个开发成员,就得告诉他git用户的密码,是不是既繁琐又不安全?
所以,如果能clone的时候只要指定项目名称,clone/push/pull自动完成身份认证,并且最好能对不同的仓库给予不同用户不同的权限,那就好了!接下来的配置就可以搞定这一切,让git仓库的管理变得更简单,操作更方便!

首先,针对身份认证的问题,我们前面已经提到git的数据交换与操作都是基于ssh的,所以,我们的身份认证自然可以通过配置ssh来解决。ssh是通过密钥进行认证管理的,密钥包括一个公钥(交给服务器)和一个私钥(自己保留),每个公钥对应一个私钥,每个私钥也只对应一个公钥。。。。此处省略若干字。。。。,所以一个简单的解决自动身份认证的方式就是:每个需要访问代码仓库的人员,在自己的机器上通过ssh-keygen生成自己的公钥与私钥,将公钥提交给服务器,服务器管理员将改用户的公钥添加到服务器git用户的.ssh/authorized_keys文件中

安装openssh服务


通过命令安装SSH服务

sudo apt-get install openssh-server

通过命令 ,查看ssh服务是否启动。

ps –e|grep ssh

启动SSH服务。
输入命令: 重启SSH服务
service sshd restart sshd unrecognized service

ssh service 在ubantu叫 ssh  
所以重启ssh  
sudo service ssh restart  

centos上是sshd

service sshd restart 

命令:service sshd start 启动服务 | 命令:service sshd stop 停止服务
重启后可输入:netstat -antp | grep sshd 查看是否启动22端口(可略)。
如何设置SSH服务为开机启动?
◆输入命令:chkconfig sshd on 即可。
注:若是chkconfig sshd off则禁止SSH开机启动。

创建一个 ~/.ssh 的框架,并设置好合适的权限。这很重要,如果权限设置得太开放会使自己所保护的 SSH 没有意义。

$ su - git
$ mkdir .ssh && chmod 700 .ssh 
$ touch .ssh/authorized_keys 
$ chmod 600 .ssh/authorized_keys 

authorized_keys 文件里包含所有你的开发者们的 SSH 公钥,你开放权限允许他们可以在你的 Git 项目上工作。他们必须创建他们自己的 SSH 密钥对然后把他们的公钥给你。复制公钥到 gituser 用户下的 authorized_keys 文件中

在本地创建你自己的客户端的SSH Key

首先在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash)
设置本地git用户配置

$ git config --global user.name "username"
$ git config --global user.email "[email protected]"
$ ssh-keygen -t rsa -C "[email protected]"  

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
说明:查看git所有配置项

$ git config -l  

Git服务器打开RSA认证
然后就可以去Git服务器上添加你的公钥用来验证你的信息了。在Git服务器上首先需要将/etc/ssh/sshd_config中将RSA认证打开,即:

sudo vim /etc/ssh/sshd_config
RSAAuthentication yes     
PubkeyAuthentication yes     
AuthorizedKeysFile  .ssh/authorized_keys

将刚生成的公钥复制进去,以后还有成员加入进来时,要在authorized_keys中追加,追加然后再次clone的时候,或者是之后push的时候,就不需要再输入密码了:

Zhu@XXX/E/testgit/8.34
$ git clone git@192.168.8.34:/home/git/repositories/helloworld
Cloning into 'helloworld'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

禁用git用户的shell登陆
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

sudo vim /etc/passwd
git:x:1001:1001:,,,:/home/git:/bin/bash  

最后一个冒号后改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell  

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

管理公钥和权限
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitlab来管理公钥和权限,Gitlab类似Github


在centos下安装git服务器


和Ubuntu下类似注意命令的差别
yum install git
centos下更新git版本http://www.cnblogs.com/boxuan/articles/6434109.html


感谢以下链接的帮助
参考:http://freeloda.blog.51cto.com/2033581/1410562
参考:http://blog.csdn.net/xsl1990/article/details/25486211
参考:http://blog.csdn.net/wave_1102/article/details/47779401

发布了175 篇原创文章 · 获赞 76 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/qq_29232943/article/details/56835554
今日推荐