简单步骤:
1、安装git服务,并创建git账号
2、创建示例仓库sample
3、导入客户端公钥
4、客户端连接并提交内容
5、修改Git权限,只使用git-shell命令

— detail —

一、安装git
直接通过apt-get安装git。使用这个方式比较简单,当然也可以使用git源代码自己编译最新版本。

apt-get update

apt-get install git -y

1.1 创建git用户
创建git账户并登录,直接指定用户目录到/home/git

useradd git -d /home/git -m -s /bin/bash

passwd git //设置git用户的密码

Enter new UNIX password: //输入新密码,输入的密码无回显
Retype new UNIX password: //确认密码
passwd: password updated successfully

su git

添加用户 user add
-d:指定用户目录
-m:如果目录不存在则创建
-s:可以指定用户使用的命令

二、创建sample库
创建库很简单,注意使用–bare参数。作为代码仓库服务器并不会在上面修改东西,所以只要有相关提交日子就可以。

$ cd ~
$ git init –bare sample.git
三、设置SSH Key
收集客户端公钥,复制到服务器上。 客户端当前账号RSA或DSA的数字签名文件id_rsa.pub 在.ssh用户目录中。通常情况下windows在 %userprofile%.ssh 目录中,Mac在~/.ssh目录中。

mac上可以直接使用下面命令复制粘贴板上,或使用ssh上传

$ pbcopy < ~/.ssh/id_rsa.pub
win7上可以打开Git GUI界面有个帮助->show SSH Key菜单,如果没创建过可以点击创建SSH的签名文件,并复制公钥保存到服务器上。如果使用第三方的SSHKey服务,那可能实际位置会有些差异。

生成本地用户的签名文件,并把客户端上公钥导入到服务器上。如果有多个的话可以放在一个目录中,方便导入。如果是团队人比较多这种方式可能就不太适合了。

如把客户端的key文件mymac.pub和mywin.pub导入。

$ ssh-keygen -t rsa -b 4096
$ cat mymac.pub >> ~/.ssh/authorized_keys
$ cat mywin.pub >> ~/.ssh/authorized_keys
3.1 客户端获取sample库,并增加文件上传到服务器
在Mac客户端获取。

$ git clone ssh://git@221.99.99.99:9922/home/git/sample.git
Cloning into ‘sample’…
warning: You appear to have cloned an empty repository.
Checking connectivity… done.
获取成功OK,增加一个文件,并提交到服务器上

$ cd sample
$ cat >> readme.md
first file.
^c
$ git add .
$ git commit -m “first commit”
$ git push origin master
3.2 服务器上查看状态
$ git log
commit 8b070256af351b43a74753f0b05969fcfe9c7310
Author: moguf moguf_notify@163.com
Date: Sun Apr 3 20:49:17 2016 +0800

first commit

3.3 在Win客户端获取
windows上可以直接使用git或TortoiseGit获取。

git@192.168.10.14:/home/git/sample.git
新建一个文件并提交到服务器上。在服务器上通过git log就能看到第二提交的内容。mac客户机上git pull能看到刚才新加的文件。

这样Git服务器仓库功能基本完成。

四、安全问题
为安全考虑Git账号只允许使用git-shell。在passwd文件中找到git用户,把/bin/bash直接修改成/usr/bin/git-shell 登录root账号,并修改git的用户权限。

$ su

vim /etc/passwd

这样git用户只能git-shell命令不能登录了。

使用 su git 命令就会出现下面提示,git用户就无法登录到shell,这样就OK了。

su git

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.