在服务器已有目录中部署 Git 仓库

适用场景

本教程为你解决一个非常具体的部署问题:你需要在服务器上一个已经存在的、并且非空的目录(例如由网站面板创建的站点根目录)中,拉取并部署一个 Git 仓库。

因为 git clone 命令只能在空目录或不存在的目录中执行,直接使用会报错,所以我们需要采用"初始化 -> 关联 -> 拉取 -> 重置"这套更灵活的方案。


操作流程

步骤一:准备 GitHub 个人访问令牌 (PAT)

在开始操作服务器之前,我们首先需要准备一个关键的凭据:个人访问令牌(Personal Access Token)。由于 GitHub 不再支持使用账户密码进行命令行操作,令牌是目前唯一的认证方式。

  1. 登录 GitHub

    在你的电脑浏览器上登录 GitHub 账户。

  2. 进入开发者设置

    点击右上角头像 → Settings → 左侧菜单栏底部 Developer settings

  3. 选择令牌类型

    在左侧菜单中,选择 Personal access tokensTokens (classic)

  4. 生成新令牌

    点击页面右上方的 Generate new token 按钮,然后选择 Generate new token (classic)

  5. 配置令牌权限

    • Note (备注) :给令牌起个名字,方便你记住它的用途,例如 my-server-deploy
    • Expiration (有效期) :选择一个有效期,如 90 days
    • Select scopes (选择权限)这是最重要的一步。 请直接勾选顶级的 repo 复选框。这会授予该令牌所有与仓库相关的权限,足以满足部署需求。
  6. 生成并保存令牌

    滚动到页面底部,点击 Generate token

  7. ⚠️ 立即复制并妥善保管!

    页面会显示一串以 ghp_ 开头的字符,这就是你的令牌。请立即复制它 ,并保存在一个安全的地方。这个令牌只会显示这一次,刷新或关闭页面后将无法再次查看!


步骤二:登录服务器并执行 Git 操作

现在,你已经拥有了令牌,可以正式开始在服务器上部署了。

  1. 进入目标目录

    通过 SSH 登录你的服务器,然后 cd 到你想要部署代码的目录。

    bash 复制代码
    # 将下面的路径替换成你自己的
    cd /www/wwwroot/www.site.cn
  2. 初始化并关联仓库

    首先,将这个目录变成一个本地 Git 仓库;然后,告诉它远程仓库的地址。

    bash 复制代码
    # 1. 初始化
    git init
    
    # 2. 关联远程仓库 (将 URL 替换成你自己的)
    git remote add origin https://github.com/www/site.git

    你可以运行 git remote -v 来检查是否关联成功。

  3. 拉取远程数据并认证

    这是最关键的交互步骤。运行 fetch 命令来下载远程仓库的所有信息。

    bash 复制代码
    git fetch origin

    终端会依次提示你输入凭据:

    • Username for 'https://github.com':

      在这里输入你的 GitHub 用户名,然后回车。

    • Password for 'https://...':

      在这里粘贴你在步骤一中生成的个人访问令牌 (PAT)。注意:输入时光标不会移动,这是正常的,粘贴后直接回车即可。

    如果凭据正确,你会看到下载对象的进度条,代表数据已成功拉取到本地的 .git 数据库中。

  4. 强制更新工作目录

    现在,数据已经下载完毕,我们用最后一条命令,将当前目录的文件强制刷新成和远程仓库一模一样。

    bash 复制代码
    # 警告:此操作会覆盖本地所有文件,请谨慎操作!
    # 确保 origin/main 是你仓库的默认分支 (也可能是 origin/master)
    git reset --hard origin/main

    当看到 HEAD is now at ... 的提示时,就意味着你的目录内容已经和远程仓库完全同步了。

  5. 验证成果

    最后,确认一下文件是否都已就位。

    bash 复制代码
    ls -la

    列出的文件列表应该和你的 GitHub 仓库根目录完全一致。恭喜你,部署成功!


附录:常见问题排查

  • 问题:认证失败 (Authentication failed)

    • 原因:输入了 GitHub 账户密码,而不是个人访问令牌。
    • 解决 :严格按照本教程步骤一生成并使用 PAT。
  • 问题:网络超时 (Connection timed out)

    • 原因 :服务器无法连接到 github.com
    • 解决 :在服务器上运行 ping github.com 测试网络。如果不通,请检查服务器防火墙或云服务商的安全组 规则,确保出站TCP 443 端口是开放的。
  • 问题:所有权可疑 (dubious ownership)

    • 原因 :当前用户(如 root)没有此目录的所有权,Git 出于安全考虑发出警告并中断操作。

    • 解决 :按照 Git 的提示,将该目录添加为安全目录即可。

      bash 复制代码
      # 将路径替换成你自己的
      git config --global --add safe.directory /www/wwwroot/md.xtyzx.cn
相关推荐
用户03284722207011 小时前
如何搭建本地yum源(上)
运维
深海鱼在掘金3 天前
Git 完全指南 —— 第1章:Git 概览与版本控制演进
git
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz3 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈4 天前
Unix 与 Linux 异同小叙
linux·服务器·unix