搭建远程 Git 私库

安装 git

1
2
3
git --version // 如无,则安装
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
yum install -y git

创建用户并配置仓库

1
2
3
4
5
6
7
8
9
useradd git
passwd git // 设置密码
su git // 这步很重要,不切换用户后面会很麻烦
cd /home/git/
mkdir -p projects/blog // 项目存在的真实目录
mkdir repos && cd repos
git init --bare blog.git // 创建一个裸露的仓库
cd blog.git/hooks
vim post-receive // 创建 hook 钩子函数,输入了内容如下

创建 hook 钩子函数,输入了内容如下

1
2
#!/bin/sh
git --work-tree=/home/git/projects/blog --git-dir=/home/git/repos/blog.git checkout -f

修改权限

1
2
3
chmod +x post-receive
exit // 退出到 root 登录
chown -R git:git /home/git/repos/blog.git // 添加权限

本地电脑建立ssh信任

1
2
3
4
5
# 生成密钥
ssh-keygen -t rsa #-t表示类型选项,这里采用rsa加密算法
#将生成的密钥复制到远程主机的 authorized_keys 文件上
ssh-copy-id -i C:/Users/yourname/.ssh/id_rsa.pub git@server_ip
ssh git@server_ip // 测试能否登录

注:报错'ssh-copy-id' 不是内部或外部命令,也不是可运行的程序时。

  1. 打开 powershell,再执行 ssh-copy-id 命令
1
2
3
ssh-copy-id git@server_ip
# 或
ssh-copy-id -i C:/Users/yourname/.ssh/id_rsa.pub git@server_ip # -i 为指定文件
  1. 如果报错ssh-copy-id : 无法将“ssh-copy-id”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。,则执行以下代码。
1
2
3
4
5
6
7
8
9
function ssh-copy-id([string]$userAtMachine, $args){
$publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub"
if (!(Test-Path "$publicKey")){
Write-Error "ERROR: failed to open ID file '$publicKey': No such file"
}
else {
& cat "$publicKey" | ssh $args $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"
}
}
  1. 再执行 ssh-copy-id 命令

为了安全起见禁用 git 用户的 shell 登录权限,从而只能用 git clone,git push 等登录

1
2
3
4
cat /etc/shells # 查看 git-shell 是否在登录方式里面
which git-shell # 查看是否安装
vi /etc/shells
# 添加上2步显示出来的路径,通常在 /usr/bin/git-shell

修改/etc/passwd 中的权限

1
2
3
4
5
6
7
vim /etc/passwd

# 原
git:x:1000:1000::/home/git:/bin/bash

# 修改为
git:x:1000:1000:,,,:/home/git:/usr/bin/git-shell