搭建git服务器

搭建内网 Git 让代码提交更方便与安全。


安装git

首先你得有一台服务器,然后在此服务器上安装git.

如果你想从源码安装 Git,需要安装 Git 依赖的库:curlzlibopensslexpat,还有libiconv

安装依赖

  • Centos:

sudo yum install dh-autoreconf curl-devel expat-devel gettext-devel openssl-devel zlib-devel getopt

sudo yum install asciidoc xmlto docbook2x

  • ubuntu:

sudo apt-get install dh-autoreconf libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev install-info getopt

sudo apt-get install asciidoc xmlto docbook2x

下载git源码包

当你安装好所有的必要依赖,你可以继续从几个地方来取得git最新发布版本的 tar 包。

你可以从Kernel.org 网站获取,网址为 https://www.kernel.org/pub/software/scm/git

或从 GitHub 网站上的镜像来获得,网址为 https://github.com/git/git/releases

通常在 GitHub 上的是最新版本,但 kernel.org 上包含有文件下载签名,如果你想验证下载正确性的话会用到。

编译并安装git

tar -zxf git-2.0.0.tar.gz

cd git-2.0.0

make configure

./configure --prefix=/usr

sudo ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi      #Centos上要执行,ubuntu上不用执行

make all doc info

sudo make install install-doc install-html install-info

sudo ln -s /opt/git/bin/git /usr/bin/git

升级git版本

git clone git://git.kernel.org/pub/scm/git/git.git

自此git安装完成.

git源码安装文档

上传ssh key到vps

在本地(个人PC)执行下面命令

scp ~/.ssh/id_rsa_vpsgit.pub root@blog.xujianhui.cn:/home/

在git服务器上以具有root权限的账户执行如下命令:

useradd git

mkdir -p /home/git/.ssh

cat /home/id_rsa.vpsgit.pub > /home/git/.ssh/authorized_keys

chown -R git:git /home/git/.ssh

chmod 700 /home/git/.ssh

chmod 644 /home/git/.ssh/authorized_keys

限制git登录shell

  • 启用git-shell

vim /etc/shells

添加

/opt/git/bin/git-shell # 这里需改为git-shell的实际路径,一般在/usr/bin/git-shell

source /etc/shells

以git账号登录系统执行下面的命令

chsh -s /opt/git/bin/git-shell # 这里需改为git-shell的实际路径,一般在/usr/bin/git-shell

mkdir $HOME/git-shell-commands

cat >$HOME/git-shell-commands/no-interactive-login <<\EOF
#!/bin/sh
printf '%s\n' "Hi $USER! You've successfully authenticated, but I do not"
printf '%s\n' "provide interactive shell access."
exit 128
EOF

chmod +x $HOME/git-shell-commands/no-interactive-login

  • 测试git登录

ssh -p 20222 git@106.14.118.68

输出如下内容表示git账号不能登录shell了。

Last login: Sun Sep 23 12:05:08 2018 from 101.45.158.9

Welcome to Alibaba Cloud Elastic Compute Service !

Hi git! You’ve successfully authenticated, but I do not
provide interactive shell access.

git-shell官方文档

警告

报错fatal: protocol error: bad line length character: This可能跟禁用了git账号登录有关

在git服务器上创建裸仓库及钩子

下面的操作是在git服务器上执行

  • 创建裸仓库
mkdir -p /home/git/blogdata
chown git:git /home/git/blogdata
cd /home/git/blogdata
git init --bare blog.git        创建裸仓库,只用来共享
chown -R git:git blog.git
sudo ln -s  /usr/local/git/bin/git-upload-pack  /usr/bin/git-upload-pack
sudo ln -s /usr/local/git/bin/git-receive-pack  /usr/bin/git-receive-pack
  • 创建hooks钩子

vim /home/git/blogdata/blog.git/hooks/post-receive

写入如下内容

#!/bin/sh
git --work-tree=/home/git/hexo --git-dir=/home/git/blogdata/blog.git  checkout -f

添加执行权限 chmod +x post-receive

这样通过hexo d的文件就存储在/home/git/hexo里了,然后通过nginx发布heox的静态文件即可。

clone仓库到本地及创建远程仓库

下面的命令在本地机器上执行

  • clone仓库到本地

mkdir ~/gitdata

cd ~/gitdata

git clone git@blog.xujianhui.cn:/home/git/blogdata/blog.git //clone仓库到本地

  • 创建远程仓库

git remote add origin git@blog.xujianhui.cn:/home/git/blogdata/blog.git

提示

origin名称可替换成别的名字.

  • 测试
git config --global user.email "myjerrysuu@163.com"
git config --global user.name "xujh"
mkdir ~/gitdata
cd ~/gitdata
git clone git@blog.xujianhui.cn:/home/git/blogdata/blog.git
cd blog
echo "test git" > ~/gitdata/blog/gittest.txt
git add gittest.txt
git status        //查看git状态
git commit -m "first commit"
git push -u origin master       //origin为git remote add的名称

提示

先git clone–> git add –>git commit–> git push到服务器,查看/home/git/hexo有没有刚刚提交的文件,如果有,则成功.

修改~/.gitconfig文件即可修改git config 配置

配置多个ssh key

现在我需要把hexo发布到github、gcoding、vps,所以需要配置三个sshkey

分别是coding、github、vps,下面的操作都是在本机上执行.

ssh-keygen -t rsa -b 4096 -C "myjerrysuu@163.com" -f ~/.ssh/id_rsa_coding

ssh-keygen -t rsa -b 4096 -C "myjerrysuu@163.com" -f ~/.ssh/id_rsa_github

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_vpsgit

输入完命令后可以直接回车。

然后会在~/.ssh目录下生成6个文件,分别是

id_rsa_coding id_rsa_coding.pub

id_rsa_github id_rsa_github.pub

id_rsa_vpsgit id_rsa_vpsgit.pub

切记

密钥是一对的,其中.pub结尾的是公钥,是要放置到github、coding、vps等服务器上的

私钥需要保存在本地,私钥一定要好好保存.

  • git全局设置

git config –global user.email “myjerrysuu@163.com“

git config –global user.name “xujh”

上面的操作是告诉git是谁执行的操作.

下面的命令查看当前的user.name和user.email值

git config user.name

git config user.email

~/.ssh下的私钥添加到ssh-agent

ssh-add ~/.ssh/id_rsa_coding

ssh-add ~/.ssh/id_rsa_github

ssh-add ~/.ssh/id_rsa_vpsgit

ssh-add -l 查看已经有的ssh-key

ssh-add -D 删除所有ssh-key

ssh-add参数:

  • -D:删除ssh-agent中的所有密钥.
  • -d:从ssh-agent中的删除密钥
  • -e pkcs11:删除PKCS#11共享库pkcs1提供的钥匙。
  • -s pkcs11:添加PKCS#11共享库pkcs1提供的钥匙。
  • -L:显示ssh-agent中的公钥
  • -l:显示ssh-agent中的密钥
  • -t life:对加载的密钥设置超时时间,超时ssh-agent将自动卸载密钥
  • -X:对ssh-agent进行解锁
  • -x:对ssh-agent进行加锁

如果在zsh中执行ssh-add报错Could not open a connection to your authentication agent;

则需要将eval "$(ssh-agent -s)"写到~/.zshrc文件末尾,并执行source ~/.zshrc,然后在执行ssh-add命令.

ssh-add 这个命令不是用来永久性的记住你所使用的私钥的。

实际上,它的作用只是把你指定的私钥添加到 ssh-agent 所管理的一个session 当中。

而 ssh-agent 是一个用于存储私钥的临时性的 session 服务,也就是说当你重启之后,ssh-agent服务也就重置了

  • 在zsh中永久使用ssh-add

vim ~/.zshrc

在其末尾添加

eval "$(ssh-agent -s)" 2>/dev/null
ssh-add ~/.ssh/id_rsa_coding 2>/dev/null
ssh-add ~/.ssh/id_rsa_github 2>/dev/null
ssh-add ~/.ssh/id_rsa_vpsgit 2>/dev/null
ssh-add ~/.ssh/id_rsa_pi 2>/dev/null

source ~/.zshrc

  • 创建ssh config文件

git会先从ssh-agent查找,如果ssh-agent中没有就会在~/.ssh/config中查找

vim ~/.ssh/config

添加内容如下:

# coding
Host coding.net
    HostName coding.net
    PreferredAuthentications publickey
    User myjerrysuu@163.com
    IdentityFile ~/.ssh/id_rsa_coding
# github
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    User myjerrysuu@163.com
    IdentityFile ~/.ssh/id_rsa_github
 # vpsgit
 Host blog.xujianhui.cn
    HostName blog.xujianhui.cn
    PreferredAuthentications publickey
    User git
    IdentityFile ~/.ssh/id_rsa_vpsgit
 # raspyPi
 Host raspyPi
    HostName raspyPi
    PreferredAuthentications publickey
    User pi
    IdentityFile ~/.ssh/id_rsa_pi
 # vagrant1
 Host 192.168.1.19
    HostName 192.168.1.19
    PreferredAuthentications publickey
    User echoxu
    Port 10222
    IdentityFile ~/.ssh/id_rsa_vagrant

配置文件参数

  • Host : Host可以看作是一个你要识别的模式,对识别的模式,进行配置对应的的主机名和ssh文件
  • HostName : 要登录主机的主机名
  • User : 登录名
  • IdentityFile : 指明上面User对应的identityFile路径

提交代码到 Github

chmod 600 ~/.ssh/config
chmod 600 ~/.ssh/id_rsa_github
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa_github
ssh-add -l 查看已添加的 key
git config --global user.name '你的名称'
git config --global user.email '你的Email'
git config --global --list   查看配置
mkdir -p /home/iechoxu/workfiles/Apps/obsidian_orange
cd /home/iechoxu/workfiles/Apps/obsidian_orange
git init
git remote add note git@gitee.com:iEchoxu/obsidian_orange.git
git remote add notehub git@github.com:iEchoxu/obsidian_orange.git

git branch -m main # 切换到 main 分支
git push note main

ssh -vT git@github.com # 测试 ssh 密钥是否能链接 Github

sshconfig 配置

vim ~/.ssh/config,文件权限为 600

# gitee gitee 添加个人公钥管理----部署公钥管理---添加公钥---添加个人公钥
Host gitee.com
    HostName gitee.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_minio
# github
Host github.com
	HostName github.com
	PreferredAuthentications publickey
	IdentityFile ~/.ssh/id_rsa_github

上次更新:
贡献者: iEchoxu