既然说到 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

作者简介

Chun-Hui Gao is a Research Associate at Huazhong Agricultural University.

重复使用

Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The source code is licensed under MIT. The full source is available at https://github.com/yihui/hugo-prose.

欢迎修订

如果您发现本文里含有任何错误(包括错别字和标点符号),欢迎在本站的 GitHub 项目里提交修订意见。

引用本文

如果您使用了本文的内容,请按照以下方式引用:

gaoch (2018). 设置私有 Git 服务器. BIO-SPRING. /post/2018/12/29/private-git-server/

BibTeX citation

@misc{
  title = "设置私有 Git 服务器",
  author = "gaoch",
  year = "2018",
  journal = "BIO-SPRING",
  note = "/post/2018/12/29/private-git-server/"
}