Git远程09:Git服务搭建

GitHub和Gitlab是最常见的两个免费的Git Server,本博客就是搭建在GitHub上,GitLab没有于GitHub出名,其提供了免费的私有Git库,GitHub的私有库则是收费的。也可以在自己的服务器上搭建Git远程库,推送和拉取的速度比直接使用GitHub快,也不会存在安全性问题,本文介绍相关操作。

环境

操作系统:CentOS6.6
服务器IP地址:192.168.80.6
服务器Git版本:1.7.1
若服务器没有安装Git,请先安装。

1
# yum install git

客户端:Win7,Cygwin
客户端IP地址:192.168.80.2

创建Git用户

1
2
3
4
5
6
7
8
# useradd git
# passwd git # 输入git密码
Changing password for user git.
New password:
BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.

创建裸仓库

假设仓库名为gitserver.git

1
2
3
4
# su - git # 切换到git用户
$ cd ~git
$ mkdir gitserver.git; cd gitserver.git
$ git init --bare # 创建裸仓库

裸与普通仓库的区别是,裸仓库不放置具体代码,仅放置Git的信息,即裸仓库的根文件夹就是普通仓库的.git文件夹。

配置SSH连接

Git客户端可以为TortoiseGit,msysGit,本人使用Cygwin下自带的Git。请参考工具01:Cygwin的安装配置工具04:PuTTY的小伙伴PuTTYgen和Plink

开启Cygwin。先连接之前PuTTYgen生成的SSH的Key文件。

1
2
$ ln -s /cygdrive/e/putty.pem id_rsa
$ ln -s /cygdrive/e/putty.pub id_rsa.pub

将Key发送给服务器,过程中输入git密码。

1
2
3
4
5
6
7
8
9
$ ssh-copy-id git@192.168.80.6
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
git@192.168.80.6's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'git@192.168.80.6'"
and check to make sure that only the key(s) you wanted were added.

验证下是否可以免密码登录。

1
2
3
4
$ ssh git@192.168.80.6 # 无输入密码提示
[git@CentOS ~]$ exit
logout
Connection to 192.168.80.6 closed.

其他客户端也可类似配置PuTTYgen生成的key

clone仓库并操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ git clone git@192.168.80.6:gitserver
正克隆到 'gitserver'...
warning: 您似乎克隆了一个空版本库。
检查连接... 完成。
$ cd gitserver
$ mkdir 测试
$ echo hello测试 > 测试/测试文本.txt # 测试中文路径

$ git add .
$ git config user.name learnit
$ git config user.email "higoge(AT)gmail(DOT)com"

$ git commit -m "第一次提交"
[master(根提交) 8c3a846] 第一次提交
1 file changed, 1 insertion(+)
create mode 100644 测试/测试文本.txt

$ git push origin master
对象计数中: 4, 完成.
写入对象中: 100% (4/4), 295 bytes | 0 bytes/s, 完成.
Total 4 (delta 0), reused 0 (delta 0)
To git@192.168.80.6:gitserver
* [new branch] master -> master

服务器端查看

在CentOS6.6上操作本章。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ pwd
/home/git/gitserver.git

$ git log
commit 8c3a846e6b96abbd2cb22a097148f015101b0530
Author: learnit <higoge(AT)gmail(DOT)com>
Date: Wed Aug 4 19:53:53 2015 +0800

第一次提交

$ git show HEAD
commit 8c3a846e6b96abbd2cb22a097148f015101b0530
Author: learnit <higoge(AT)gmail(DOT)com>
Date: Wed Aug 4 19:53:53 2015 +0800

第一次提交

diff --git "a/\346\265\213\350\257\225/\346\265\213\350\257\225\346\226\207\346\
new file mode 100644
index 0000000..b47b693
--- /dev/null
+++ "b/\346\265\213\350\257\225/\346\265\213\350\257\225\346\226\207\346\234\254
@@ -0,0 +1 @@
+hello测试

发现中文路径名乱码。进行如下配置。

1
$ git config --global core.quotepath false

再次测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git show HEAD
commit 8c3a846e6b96abbd2cb22a097148f015101b0530
Author: learnit <higoge(AT)gmail(DOT)com>
Date: Wed Aug 4 19:53:53 2015 +0800

第一次提交

diff --git a/测试/测试文本.txt b/测试/测试文本.txt
new file mode 100644
index 0000000..b47b693
--- /dev/null
+++ b/测试/测试文本.txt
@@ -0,0 +1 @@
+hello测试

安全问题

git用户可以通过用户名密码进行访问是非常不安全的,建议禁止git用户远程Bash访问。
使用root修改/etc/passwd文件的用户git的信息。

1
2
#git:x:503:503::/home/git:/bin/bash
git:x:503:503::/home/git:/usr/bin/git-shell

git用户的默认shell改为git-shell
Cygwin测试如下。

1
2
3
4
$ ssh git@192.168.80.6
Last login: Wed Aug 4 20:06:59 2015 from 192.168.80.2
fatal: What do you think I am? A shell?
Connection to 192.168.80.6 closed.

服务器拒绝了远程登录。

但是,屏蔽了Bash后,无法使用ssh-copy-id进行Key的登记。

1
2
3
4
5
6
7
8
$ ssh-copy-id git@192.168.80.6
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
git@192.168.80.6's password:
fatal: unrecognized command '
umask 077 ;
mkdir -p .ssh && cat >> .ssh/authorized_keys || exit 1 ;
if type restorecon >/dev/null 2>&1 ; then restorecon -F .ssh .ssh/authorized_keys ; fi'

解决方法使用root用户手动修改~git/.ssh/authorized_keys,添加客户端的.pub信息。或在Cygwin下使用如下复杂的命令。

1
2
$ ssh root@192.168.80.6 'mkdir -p ~git/.ssh ; cat >> ~git/.ssh/authorized_keys ; chmod 700 ~git/.ssh; chmod 600 ~git/.ssh/authorized_keys; chown -R git:git ~git/.ssh' < ~/.ssh/id_rsa.pub
root@192.168.80.6's password:

解释下此命令:使用root登录服务器,执行单引号内的内容,首先建立~git/.ssh文件夹,将一些信息复制到~git/.ssh/authorized_keys的末尾,修改.ssh权限为700authorized_keys权限为600,因为是root创建,默认创建的文件夹和文件都是属于root用户,用chown修改文件夹及内部所有文件为git用户和组。刚才说的一些信息就是Cygwin下的~/.ssh/id_rsa.pub文件的内容。
之所以使用;而不用&&,是因为如果.ssh文件夹存在,mkdir命令会失败,使用&&后续的命令都将不执行直接返回错误。

如果本文对你有所帮助,请小额赞助
~~ EOF ~~