我有一个git存储库,它使用Vagrant为WordPress项目构建虚拟服务器(仅限本地开发)。文件夹结构大致如下(出于问题的目的)。
- Vagrantfile
- puppet/
- wordpress/
- {www public folder / root Wordpress files}
- files/
现在所有这些文件都在我的存储库的根目录中,我希望它们留在那里,所以如果我需要向Vagrant添加任何更新,它们将被添加到repo中。现在,我的主机能够通过使用git直接推送更新来允许我部署到我的登台和生产服务器。但是这些文件存储在/ wordpress /中,其服务器上的源是根。理想情况下,我只想从/ wordpress /文件夹推送到远程源的根目录。
我想将/ wordpress /文件夹移动到项目的根目录,然后将所有Vagrant文件推送到生产服务器(除非有办法添加特定于远程源的.gitignore)。
我确信有几种方法可以实现这一点,我也查看了git子树,但对于这个具体问题看起来有些过分。如果有人能提出最佳解决方案,我们将不胜感激。
答案 0 :(得分:7)
间接而且嗤之以鼻的答案是git
不是部署工具。所以你应该使用phing,或capistrano,或ant,或puppet,或者厨师,或者ansible,或者grunt,或者只是写一些bash脚本等。
简短回答是git-subtree split
。我会用这个。
解释
如果您不知道发生了什么,那么子模块甚至可能会让人感到困惑。通常,它们用于模块化开发,作为子模块的替代方案。我不会进入那个因为那不是你在这种情况下如何使用它。
出于您的目的,您将执行一个名为subtree split
的分区,以创建一个仅包含 所需目录的分支。子树拆分命令查看存储库的所有历史记录,以查看影响给定目录中文件的提交,并将它们与不存在的更改分开。然后,您可以将这些提交(或它们的压缩版本)放到它们自己的分支中。因此,当您签出该分支时,给定的目录将位于根目录,而不是其他任何内容。
坚果和螺栓
在我的解释中,我会为你做出一些选择,但你可以随意改变它们。我正在指定deploy
分支,并且我决定将您的子树历史记录压缩到单个提交中,因为您永远不应该使用该分支进行任何开发。我还假设您的存储库名称是origin。
git subtree split --prefix=wordpress --squash --branch deploy
git push -f origin deploy:deploy
通过使用deploy:deploy符号推送,您实际上不必检查部署分支(这可能需要时间)才能推送它。实际上,你可以直接通过直接推送到远程分支来避免创建分支。
git subtree push --prefix=wordpress --squash deploy master
我建议使用最后一种方法,因为它可以避免意外地对压缩的子树分支做任何事情。
但是,...子树对我不起作用,因为XYZ
是的,子树分裂有时仍然不稳定。如果由于某种原因,子树命令不是你的选项,那没关系。您可以使用较旧的,更令人困惑的git-filter-branch
命令。有关该命令的完整说明,请参阅here。
如果你坚持这个选择,那么......那很臭。你可能最好只使用子模块(可能是你现在的方式),或写一些bash脚本将文件复制到你本地的另一个仓库并推送......或其他可怕的东西。
或者您可以使用真正的部署工具。