You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git推送后自动检出:如何用单目录实现版本化单向FTP功能?

用单个Git目录实现自动检出的单向推送(模拟Mercurial行为)

当然可以!完全不用折腾两个目录就能实现你要的效果——把服务器上的单个仓库配置成允许推送并自动同步工作区,完美复刻Mercurial的单向FTP式版本控制体验。下面是一步步的操作指南:

服务器端配置

  1. 登录你的服务器,创建并进入目标目录remote/:
    mkdir remote && cd remote
    
  2. 初始化一个普通Git仓库(不是裸仓库):
    git init
    
  3. 关键配置:让Git允许推送当前分支并自动更新工作区。这条命令是Git 2.3及以上版本支持的,专门用来解决非裸仓库的推送同步问题:
    git config receive.denyCurrentBranch updateInstead
    
  4. (可选但推荐)确保服务器工作区完全和本地提交内容一致(包括自动删除本地已移除的文件):
    • 创建post-receive钩子脚本:
      nano .git/hooks/post-receive
      
    • 粘贴以下内容:
      #!/bin/sh
      # 清理未跟踪的文件和目录
      git clean -fd
      # 强制重置工作区到最新提交状态
      git reset --hard HEAD
      
    • 给脚本添加执行权限:
      chmod +x .git/hooks/post-receive
      

本地端配置与推送

  1. 进入你的本地local/仓库目录,添加服务器远程仓库地址(替换成你的服务器实际地址):
    git remote add server ssh://your-username@server-ip/path/to/remote/
    
  2. 提交本地所有需要同步的文件:
    git add .
    git commit -m "Initial sync"
    
  3. 推送到服务器:
    git push server main
    
    (如果你的主分支是master,就替换成master)

注意事项

  • 确保服务器端的remote/目录没有未提交的本地修改,否则updateInstead会拒绝推送(避免覆盖未保存的更改)。如果确实需要强制覆盖,上面的post-receive钩子已经包含了git reset --hard,可以解决这个问题。
  • 本地推送的分支要和服务器的当前分支保持一致(比如都是main),否则需要调整分支名或者配置默认推送分支。

内容的提问来源于stack exchange,提问作者Marian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:21:35