git管理代码,真香

在团队协作开发中,将代码集中存放在服务器上,可以提升代码管理和备份的效率,同时便于团队成员通过版本控制工具(如 Git)协同开发。对于非开源项目,可以选择在自己的服务器上搭建 Git 服务,而不依赖 GitHub、GitLab 等第三方平台。


一、安装 Git 并配置 Git 用户

1. 在服务器上安装 Git

以 CentOS 为例,可以通过以下命令安装 Git:

1
yum install git -y

如果使用的是其他 Linux 发行版,请根据系统包管理工具选择适合的安装命令,例如:

  • Ubuntu/Debianapt install git
  • Fedoradnf install git

2. 创建一个专门的 Git 用户

为了方便管理代码,建议创建一个专门的用户账户,用于管理 Git 仓库:

1
2
useradd git
passwd git # 设置密码

此用户将用于 SSH 登录和仓库管理。

3. 禁止 Git 用户登录 Shell

为了提升安全性,可以设置 Git 用户无法登录 Shell,只允许其使用 Git 服务:

1
vim /etc/passwd

找到 git 用户对应的行,将最后的 Shell 修改为 /bin/git-shell,如下所示:

1
git:x:1001:1001::/home/git:/bin/git-shell

这样,Git 用户只能通过 SSH 使用 Git 服务,无法直接登录服务器。


二、创建裸仓库

裸仓库是没有工作区的 Git 仓库,专门用于代码共享和版本管理。以下是创建步骤:

1
2
3
4
# 初始化裸仓库
git init --bare /home/git/project.git
# 设置仓库的权限
chown -R git:git /home/git/project.git

裸仓库通常以 .git 为后缀,以区分普通的工作区仓库。project.git 是仓库名,可以根据项目实际情况修改为更合适的名称。


三、上传代码到服务器

以下提供两种将本地代码上传到服务器的方法:

1. 新建项目并添加远程仓库

1
2
3
4
5
6
cd /path/to/code/project
git init
git add .
git commit -m "Initial commit"
git remote add origin git@your-server-ip:/home/git/project.git
git push -u origin master

your-server-ip 替换为你的服务器 IP 地址。

2. 替换已有远程仓库

如果本地代码仓库已经绑定了其他远程仓库地址,可以使用以下命令更新远程地址:

1
2
3
cd /path/to/code/project
git remote set-url origin git@your-server-ip:/home/git/project.git
git push origin master

四、克隆代码到本地

如果团队成员需要克隆代码,可以使用以下命令:

1
git clone git@your-server-ip:/home/git/project.git

确保团队成员的公钥已添加到服务器(详见后续 SSH 密钥管理 部分),以便正常进行 SSH 认证。


五、配置 SSH 密钥

为了提升安全性并减少频繁输入密码的繁琐操作,建议配置 SSH 密钥。

1. 在本地生成密钥

在本地计算机上生成 SSH 密钥对:

1
ssh-keygen -t rsa

根据提示设置密钥存储路径(默认为 ~/.ssh/id_rsa)并完成生成。

2. 将公钥上传到服务器

将生成的公钥文件上传到服务器的 Git 用户目录:

1
scp ~/.ssh/id_rsa.pub git@your-server-ip:/home/git/.ssh/

3. 添加公钥到 authorized_keys

在服务器上,将上传的公钥内容追加到 authorized_keys 文件中:

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

此后,用户可以通过 SSH 密钥直接访问服务器,无需输入密码。

注意:为了防止安全风险,请确保 authorized_keys 文件权限设置正确:

1
2
chmod 600 /home/git/.ssh/authorized_keys
chown git:git /home/git/.ssh/authorized_keys

六、配置 Git 钩子(Hooks)

Git 钩子是可以自动触发的脚本,用于在特定 Git 操作(如提交、推送)前后执行任务。常见的 Git 钩子有客户端钩子和服务端钩子。

服务端钩子:实现自动部署

以下是配置 post-receive 钩子,自动将推送到服务器的代码部署到指定目录的示例:

  1. 创建 post-receive 钩子文件:
1
vim /home/git/project.git/hooks/post-receive
  1. 写入以下脚本内容:
1
2
3
4
5
6
7
#!/bin/bash

TARGET="/var/www/project" # 部署目标目录
REPO="/home/git/project.git" # 仓库路径

mkdir -p $TARGET
git --work-tree=$TARGET --git-dir=$REPO checkout -f
  1. 为钩子文件赋予执行权限:
1
chmod +x /home/git/project.git/hooks/post-receive

每次有人向服务器推送代码时,post-receive 钩子会自动将代码部署到 /var/www/project


七、常用 Git 操作命令

以下列出了一些常用的 Git 命令,便于快速参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 克隆远程仓库
git clone git@your-server-ip:/home/git/project.git

# 查看当前仓库状态
git status

# 添加文件到暂存区
git add file-name

# 提交更改
git commit -m "commit message"

# 推送分支到远程
git push origin branch-name

# 拉取远程分支更新
git pull origin branch-name

# 更柔和的方式拉取远程分支更新
git fetch --all
# 合并master分支到当前分支
git merge origin/master
# 或者,这种会保留当前分支的提交记录
git rebase origin/master

# 查看提交历史
git log

# 删除远程分支
git push origin --delete branch-name

# 创建并推送标签
git tag -a v1.0 -m "version 1.0"
git push origin --tags

八、补充说明和建议

  1. 分支管理:建议团队使用清晰的分支管理模型(如 Git Flow)来规范开发流程。
  2. 定期备份:定期备份裸仓库文件,以防服务器故障导致代码丢失。
  3. 钩子脚本:根据项目需求,合理使用 Git 钩子实现自动化任务,例如部署、测试等。
  4. 权限管理:严格管理用户权限,定期审查 authorized_keys 中的公钥,确保无未授权访问。

通过以上步骤,你可以在自己的服务器上快速搭建 Git 仓库,实现团队协作开发。如果有其他问题,欢迎留言讨论! 😊