git服务器搭建解决方案


服务器和客户机git配置

为了直接在服务器检出,建议两个linux账户,一个是ugit是放远程仓库的(不允许ssh远程登录,init使用root等账户新增然后授权),另外一个是支持shell登录专门用于检出的帐号,建议定为uco(user checkout简写),当然也可以使用root检出。

git 查看远程地址

$ git remote -v
origin  ugit@github.example.com:/ttdata/githome/privacy (fetch)
origin  ugit@github.example.com:/ttdata/githome/privacy (push)
git是分布式的,所以不存在说git服务端和客户端之说。
服务器安装的是共享的中转库,客户机的数据和配置与远程机的完全一致。
客户机通过公网ip与远程机检入,其他客户机通过公网ip从远程机检出,也可以完全通过客户机之间通信。

一个git流程:

  • 安装git和创建用户

一般的centos都已经安装git的了,执行#git 没有找到命令说明没安装,可执行如下命令yum安装

# yum install -y git
//查看git版本
# git --version
//创建一个git系统用户
# useradd ugit -s /usr/bin/git-shell
 //修改一个密码
# passwd ugit
  • 生成公钥和密钥(产生一个RSA密钥对,备用)

默认保存在/home/www/.ssh/文件夹id_rsa和id_rsa.pub(创建的时候三次回车即可)
其中让输入passphrase则输入密钥对的保护密码,可为空。

# su ugit
$ cd ~
$ ssh-keygen -t rsa -C "ugitThreeyear"
ssh-keygen的参数含义:
-t 指定密钥类型type默认是rsa。
-C 注释文字comment比如邮箱(提交github的时候设置email即可)。
-f 密钥存储filename文件名。

authorized_keys和known_hosts
authorized_keys:免密登录公钥一行一个,为了两台Linux进行ssh双向登录(如scp直接免密)
known_hosts:本机登录过的主机指纹,自动记录,对方若重装系统则ssh过去会报错

@远程机仓库(初始化git init --bare repos.git后授权)
谁想检出,就提供公钥放到仓库用户的.ssh/authorized_keys文件
cat /home/ugit/.ssh/authorized_keys (没有该文件则创建)
一行一个,以后本地检出就不需要密码了

  • 创建版本库(远程仓库)

只有为了共享的版本库存在了,才能够创建其他的工作区。
创建版本库之前需要指定版本库路径

# mkdir -p /ttdata/githome
# git init --bare repos.git
把版本库的目录权限修改为ugit用户
# chown -R ugit.ugit repos.git
  • 检出and克隆远程机的仓库

分为两部分:Linux检出web目录、本地Windows检出开发使用

@服务器操作(Linux的web部署目录):
# su uco
$ cd ~
$ ssh-keygen -t rsa -C "ucoThreeyear"(两次默认的回车)
将~/.ssh/id_rsa.pub给远程仓库放到authorized_keys文件
$ git clone ugit@localhost:/ttdata/githome/repos.git

@客户机操作(本地电脑):
$ ssh-keygen -t rsa -C "asusNotebook"
将C:\Users\Administrator\.ssh\id_rsa.pub 公钥给git服务器管理员
$ git clone ugit@github.example.com:/ttdata/githome/repos.git rename
  • 本地变动推动到远程仓库,三步走
# git add * //添加变动文件
# git commit -m "代码提交描述" //提交到本地仓库
# git push origin master //提交到远端仓库
更新直接git pull即可

其他事项

禁止git的shell登录

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

# cat /etc/passwd | grep git
git:x:1001:1001:git version control:/home/git:/bin/bash
# vim /etc/shells
/usr/bin/git-shell #在最后增加(确保文件存在)
# chsh ugit -s /usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

需要显性指定拉取的分支

如果git pull提示如下:

There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> master

则直接指定一下即可:
git branch --set-upstream-to=origin/master master

如果提示“ssh-keygen 不是可用命令”

  1. 将ssh-keygen.exe所在的git的bin目录加入环境变量(如C:Program FilesGitusrbin)
  2. 安装openssh后操作 https://www.openssh.com

原文链接:https://blog.yongit.com/note/888.html