一、服务器端准备
1. 安装Git并创建Git用户
bash
sudo apt update
sudo apt install git -y
sudo adduser git # 按照提示设置密码
2. 配置Git用户的SSH访问
bash
# 切换到git用户
sudo su - git
# 创建.ssh目录并设置权限
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
3. 创建仓库目录
bash
# 仍在git用户下
mkdir -p ~/repositories
cd ~/repositories
# 创建一个裸仓库(bare repository)
git init --bare myproject.git
# 设置目录权限(确保git用户可以写入)
chmod -R 755 ~/repositories
二、客户端准备
1. 生成SSH密钥(如果还没有)
bash
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 按回车接受默认位置
# 可以设置密钥密码或留空
2. 查看公钥内容
bash
cat ~/.ssh/id_rsa.pub
复制显示的公钥内容(以 `ssh-rsa` 开头)
3. 配置本地Git
bash
git config --global user.name "Your Name"
git config --global user.email "your@email.com"
三、将客户端SSH公钥添加到服务器
方法A:通过ssh-copy-id(推荐)
```bash
# 在客户端执行
ssh-copy-id git@your-server-ip
# 输入git用户的密码
```
方法B:手动添加
```bash
# 在客户端将公钥复制到服务器
ssh git@your-server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub
# 输入git用户的密码
```
方法C:通过ssh直接编辑
```bash
# 登录到服务器
ssh git@your-server-ip
# 在服务器上编辑authorized_keys
echo "你的公钥内容" >> ~/.ssh/authorized_keys
exit
```
四、客户端推送到服务器的完整流程
1. 新建项目并推送
```bash
# 创建本地项目目录
mkdir myproject
cd myproject
# 初始化本地仓库
git init
# 创建文件并提交
echo "# My Project" > README.md
git add README.md
git commit -m "Initial commit"
# 添加远程仓库
git remote add origin git@your-server-ip:repositories/myproject.git
# 推送到服务器
git push -u origin main # 或 master
```
2. 推送现有项目
```bash
cd existing-project
# 初始化(如果还没初始化)
git init
# 添加远程仓库
git remote add origin git@your-server-ip:repositories/myproject.git
# 首次推送(强制推送如果远程仓库不为空)
git push -u origin main --force
# 或
git push -u origin main
```
3. 推送新分支
```bash
# 创建并切换到新分支
git checkout -b feature-branch
# 做一些更改并提交
git add .
git commit -m "Add new feature"
# 推送新分支到服务器
git push -u origin feature-branch
```
五、解决常见推送问题
### 问题1:权限被拒绝
```bash
# 错误:Permission denied (publickey)
# 解决方案:
# 1. 确保SSH密钥已正确添加
# 2. 检查服务器端权限
ssh git@your-server-ip "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
# 3. 在客户端测试SSH连接
ssh -T git@your-server-ip
```
### 问题2:远程仓库不为空
```bash
# 错误:remote contains uncommitted work
# 解决方案:
# 先拉取再推送
git pull origin main --allow-unrelated-histories
git push origin main
# 或者强制推送(慎用)
git push origin main --force
```
### 问题3:推送被拒绝(非快进)
```bash
# 错误:non-fast-forward updates were rejected
# 解决方案:
git pull --rebase origin main
git push origin main
# 或者
git fetch origin
git merge origin/main
git push origin main
```
六、推送后的验证
### 1. 在服务器端检查
```bash
# 登录到服务器
ssh git@your-server-ip
cd repositories/myproject.git
# 查看接收的提交
git log --oneline
# 查看分支
git branch -r
```
### 2. 在另一台客户端克隆验证
```bash
# 在其他机器上
git clone git@your-server-ip:repositories/myproject.git
cd myproject
ls -la # 查看文件
git log --oneline # 查看提交历史
```
七、配置简化SSH连接
### 1. 编辑SSH配置文件(客户端)
```bash
nano ~/.ssh/config
```
添加以下内容:
```config
Host myserver
HostName your-server-ip
User git
IdentityFile ~/.ssh/id_rsa
Port 22
```
### 2. 使用别名推送
```bash
# 添加远程仓库时使用别名
git remote add origin myserver:repositories/myproject.git
# 推送时更简单
git push origin main
```
八、自动化脚本示例
### 服务器端初始化脚本
```bash
#!/bin/bash
SERVER_IP="your-server-ip"
PROJECT_NAME="$1"
# 在服务器上执行
ssh git@$SERVER_IP "
cd ~/repositories
git init --bare $PROJECT_NAME.git
echo 'Repository $PROJECT_NAME.git created successfully'
"
```
### 客户端一键推送脚本
```bash
#!/bin/bash
SERVER="git@your-server-ip"
REPO_PATH="repositories/myproject.git"
git add .
git commit -m "$1"
git push SERVER:REPO_PATH main
```
## 注意事项
1. **首次推送**:使用 `-u` 参数设置上游分支,后续只需 `git push`
2. **权限管理**:确保只有授权用户能推送
3. **冲突处理**:推送前先拉取最新代码
4. **备份重要数据**:定期备份服务器端仓库
5. **查看推送状态**:使用 `git status` 和 `git log` 验证推送结果
按照这些步骤,你应该能顺利将客户端代码推送到SSH协议的Git服务器上。