GitHub和Gitlab是最常见的两个免费的Git Server,本博客就是搭建在GitHub上,GitLab没有于GitHub出名,其提供了免费的私有Git库,GitHub的私有库则是收费的。也可以在自己的服务器上搭建Git远程库,推送和拉取的速度比直接使用GitHub快,也不会存在安全性问题,本文介绍相关操作。
环境
操作系统:CentOS6.6
服务器IP地址:192.168.80.6
服务器Git版本:1.7.1
若服务器没有安装Git,请先安装。
客户端:Win7,Cygwin
客户端IP地址:192.168.80.2
创建Git用户
1 2 3 4 5 6 7 8
|
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
|
$ 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:/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
权限为700
,authorized_keys
权限为600
,因为是root
创建,默认创建的文件夹和文件都是属于root
用户,用chown
修改文件夹及内部所有文件为git
用户和组。刚才说的一些信息就是Cygwin下的~/.ssh/id_rsa.pub
文件的内容。
之所以使用;
而不用&&
,是因为如果.ssh
文件夹存在,mkdir
命令会失败,使用&&
后续的命令都将不执行直接返回错误。
~~ EOF ~~