能否将Git仓库指定目录推送到远程裸仓库?
仅推送指定目录到Web服务器Bare仓库的方法
既然你没法用子模块、子树,也没法在bare仓库用稀疏检出,那可以试试这两种不需要修改仓库结构的方案,都是在本地处理好要推送的内容再推送到远程bare仓库:
方法一:临时分支+Git Filter-Repo(推荐)
这个方法会创建一个临时分支,只保留你需要推送的目录内容,推送到远程后再删掉临时分支,完全不影响主仓库的结构:
- 先确保你安装了
git filter-repo(这是Git官方推荐用来替代老旧的git filter-branch的工具,大多数包管理器都能找到它) - 从主分支(比如
main)创建一个临时分支:git checkout -b temp-web-branch main - 用
filter-repo筛选出目标目录(比如web-dir/),并把它的内容移到分支的根目录(方便Web服务器直接部署):
执行完后,这个临时分支里就只有原来git filter-repo --path web-dir/ --path-rename web-dir/:web-dir下的所有内容,而且都在根路径下了。 - 推送到Web服务器的bare仓库:
这里git push web-server temp-web-branch:mainweb-server是你配置的远程仓库别名,temp-web-branch:main表示把本地临时分支推送到远程的main分支(你也可以改成其他分支名,比如web-deploy) - 推送完成后,切回主分支并删除临时分支:
git checkout main git branch -D temp-web-branch
方法二:直接推送目录归档(无需创建分支)
如果你不想创建临时分支,可以用git archive把目标目录打包,直接推送到远程的指定分支:
git archive main:web-dir/ | git push web-server main:refs/heads/web-deploy
这个命令会把main分支下web-dir目录的内容打包,然后作为一个新提交推送到远程的web-deploy分支。
配合Web服务器的Post-Receive钩子调整
不管用哪种方法,你都需要调整Web服务器上bare仓库的post-receive钩子,确保它从正确的分支检出内容到Web目录。比如原来的钩子如果是:
#!/bin/sh git --work-tree=/var/www/html --git-dir=/path/to/bare/repo checkout -f
如果用了专门的部署分支(比如web-deploy),就改成:
#!/bin/sh git --work-tree=/var/www/html --git-dir=/path/to/bare/repo checkout -f web-deploy
这样每次推送后,钩子就只会把你指定目录的内容部署到Web服务器上了。
内容的提问来源于stack exchange,提问作者Fowler
相关产品推荐
相关产品推荐

