Git新手求助:SSH主机与虚拟机Git仓库同步异常问题
Git推送后主机工作目录未更新的解决方法
问题原因
你在主机创建的是非裸仓库(git init默认生成带工作目录的仓库),Git出于避免冲突的设计,不会自动将推送的提交同步到非裸仓库的工作目录中。而git pull是主动拉取合并到本地工作目录,因此能正常同步。
解决方案
方案1:将主机仓库改为裸仓库(推荐,符合Git远程仓库的标准用法)
- 先备份主机
/z/Project/MYFIRSTPROJECT下的所有文件(防止数据丢失) - 删除原仓库,重新创建裸仓库:
rm -rf /z/Project/MYFIRSTPROJECT mkdir /z/Project/MYFIRSTPROJECT.git cd /z/Project/MYFIRSTPROJECT.git git init --bare - 将备份的文件导入并推送到裸仓库:
cd /path/to/your/backup/MYFIRSTPROJECT git init git add . git commit -m "initial commit" git push git+ssh://admin@192.168.1.1/z/Project/MYFIRSTPROJECT.git master - 虚拟机侧重新克隆新的裸仓库:
git clone git+ssh://admin@192.168.1.1/z/Project/MYFIRSTPROJECT.git
后续虚拟机推送后,若主机需要查看最新内容,可在任意目录克隆该裸仓库,或在本地仓库执行git fetch获取更新。
方案2:配置主机仓库的钩子自动更新工作目录(适合需主机工作目录实时同步的场景,有风险)
- 进入主机仓库的钩子目录:
cd /z/Project/MYFIRSTPROJECT/.git/hooks - 创建
post-receive钩子文件并写入内容:cat > post-receive << EOF #!/bin/sh cd /z/Project/MYFIRSTPROJECT || exit git checkout -f EOF - 给钩子文件添加执行权限:
chmod +x post-receive
注意:此方法会直接覆盖主机工作目录的未提交修改,仅适用于主机工作目录不手动修改、仅作为同步展示的场景。
内容的提问来源于stack exchange,提问作者Thomas San
相关产品推荐
相关产品推荐

