Git推送后自动检出:如何用单目录实现版本化单向FTP功能?
用单个Git目录实现自动检出的单向推送(模拟Mercurial行为)
当然可以!完全不用折腾两个目录就能实现你要的效果——把服务器上的单个仓库配置成允许推送并自动同步工作区,完美复刻Mercurial的单向FTP式版本控制体验。下面是一步步的操作指南:
服务器端配置
- 登录你的服务器,创建并进入目标目录
remote/:mkdir remote && cd remote - 初始化一个普通Git仓库(不是裸仓库):
git init - 关键配置:让Git允许推送当前分支并自动更新工作区。这条命令是Git 2.3及以上版本支持的,专门用来解决非裸仓库的推送同步问题:
git config receive.denyCurrentBranch updateInstead - (可选但推荐)确保服务器工作区完全和本地提交内容一致(包括自动删除本地已移除的文件):
- 创建
post-receive钩子脚本:nano .git/hooks/post-receive - 粘贴以下内容:
#!/bin/sh # 清理未跟踪的文件和目录 git clean -fd # 强制重置工作区到最新提交状态 git reset --hard HEAD - 给脚本添加执行权限:
chmod +x .git/hooks/post-receive
- 创建
本地端配置与推送
- 进入你的本地
local/仓库目录,添加服务器远程仓库地址(替换成你的服务器实际地址):git remote add server ssh://your-username@server-ip/path/to/remote/ - 提交本地所有需要同步的文件:
git add . git commit -m "Initial sync" - 推送到服务器:
(如果你的主分支是git push server mainmaster,就替换成master)
注意事项
- 确保服务器端的
remote/目录没有未提交的本地修改,否则updateInstead会拒绝推送(避免覆盖未保存的更改)。如果确实需要强制覆盖,上面的post-receive钩子已经包含了git reset --hard,可以解决这个问题。 - 本地推送的分支要和服务器的当前分支保持一致(比如都是
main),否则需要调整分支名或者配置默认推送分支。
内容的提问来源于stack exchange,提问作者Marian
相关产品推荐
相关产品推荐

