2 min read

设置私有 Git 服务器

既然说到 Git,GitHub 你一定是了解的。GitHub 对于私有仓库是收费的。如果你项目还在进行中,需要一个仓库却又不想付高昂的服务费。使用自己的服务器当然也是可以的,而且很方便。

自己的服务器可以是阿里云这样的主机服务商,也可以是你能访问的任意一台Linux主机。只要能够 SSH 登录即可。

从服务器中开始

如果你的文件目前存储在服务器端,想在本地开展工作并使用服务器同步更新,可以参考下面的操作。

服务器端配置

  • 添加一个新用户(也可以使用原有用户).
adduser git

在添加用户git时, 会创建 /home/git 目录, 同时还会创建 git 用户组.

  • 在服务器上创建一个git仓库(“sample”).
cd /home/git
mkdir sample.git
git init --bare sample.git
# 由于使用的是 root 用户新建的文件夹, 需要修订文件夹权限
chown -R git:git sample.git
  • 添加git的ssh认证.
mkdir /home/git/.ssh
cat ~/.ssh/authorized_keys << EOF
将你的 ssh.pub 公钥粘贴到这里, 每行一个人.
将合作用户的 公钥粘贴到这里, 每行一个人.
EOF

你的 ssh.pub 公钥可以在本地电脑上使用cat ~/.ssh/id_rsa.pub查看.

客户端操作

  • 从服务器clone repository.
git clone git@remote.com:/home/git/sample.git
  • 添加内容, 修改, 更新….
cd sample
cat > README << EOF
This is readme. For test.
EOF
git add .
git commit --message "Initial Commit"

git push

从本地开始

如果你本地有一个 Git 仓库,想把它上传到服务器中以便于随时随地访问和多人协同作业,则可以参考下面的操作。

客户端使用

对于一个本地已有的仓库, 将其上传到自建git服务器上需要以下几个步骤:

  1. git 服务器中创建一个对应目录;
  2. 在本地软件仓库中添加远程映射;
  3. 将本地仓库上传到远程服务器.
# Server
cd
mkdir new.git
# 如果是用root用户创建的文件夹, 则需要将文件夹完整权限转交给git用户
chown -R git:git new.git
git init --bare new.git

# Local
cd /path/to/my/existed/git/project
git remote add origin git@remote.com:/home/git/new.git
# 对库做一些更新
# 如添加文件,git add
git push --set-upstream origin master
git push origin master

注意:本地文件有更新才能操作成功。

如果要变更远程仓库的地址,可以使用git remote remove origin来删除指定的远程链接。git remote命令可用于查看当前的远程链接。

git bare repository的特点

git init --bare project.git 会创建一个 bare repository。它与git init创建的 repository 的不同之处在于:

  • bare 不保存工作目录和文件,只有 git 需要的文件;
  • 标准 repository 可见的是工作目录和文件,git 需要的文件被隐藏到 .git 文件夹中;
  • bare 其实就是 .git 文件夹中的内容;
  • 因此,bare 命名通常会在目录名末尾加上 .git 以示区别(当然不加也可以);
  • 如果只用作仓库时,选择 bare 可以节省空间;
  • 两种 repository 都可以进行 clonelog 等操作。

客户端配置

其他用户使用时, 需要:

参考下面的代码.

# 首先打开 Git Bash 软件
# Windows 下在任意目录点击右键, 选择 Git Bash here 即可
# 输入下面的代码
# 设置用户名和邮箱
git config --global user.name=your_user_name
git config --global user.email=your@email.com

用户名和邮箱是为了区分不同协作者之用.

  • 生成一对密钥. 私钥自己保存, “公钥” 提交给管理员, 由管理员添加到服务器中;

继续输入以下代码即可.

# 在 .ssh 目录创建密钥
ssh-keygen

# 查看公钥
cat ~/.ssh/id_rsa.pub

# 查看私钥
cat ~/.ssh/id_rsa

然后, 就可以从服务器中新建项目(clone), 提取项目更新(pull), 更新(push).

git clone git@remote.com:/home/git/new.git

然后就可以在本地的 new 文件夹下面看到项目的内容. 可以编辑. 编辑完之后, 按下面操作.

# 如果有新文件, 需要加入仓库
git add R/newfile.R

# 如果仅对现有文件有改动(编辑/删除)
git commit -a -m "对文件改动的说明"

# 将这些修改提交到服务器上
git push

# 如果服务器上的文件有更新(其他人已经push过)
# 则先要将本地仓库与服务器仓库对齐
# 然后再执行前面的几条命令
git pull

将本地与服务器用 Git 关联起来

在服务器端:

vi ~/.ssh/authorized_keys
# 把 Git 程序使用的 SSH id_rsa.pub 添加进去

mkdir ~/demo.git
git init --bare ~/demo.git

在本地端:

git init
# add and commit
# empty repository is not allowed while push
git remote add origin user@host:/home/demo.git origin
git push --set-upstream origin master