4

我有一个 git 存储库,它使用 Vagrant 为 WordPress 项目构建虚拟服务器(仅限本地开发)。文件夹结构大致如下(出于问题的目的)。

- Vagrantfile
- puppet/
- wordpress/
    - {www public folder / root Wordpress files}
- files/

现在所有这些文件都在我的存储库的根目录中,我希望它们留在那里,所以如果我需要向 Vagrant 添加任何更新,它们将被添加到存储库中。现在我的主机允许我通过直接使用 git 推送更新来部署到我的登台和生产服务器。但是这些文件存储在 /wordpress/ 中,其服务器上的来源是根。理想情况下,我只想从 /wordpress/ 文件夹推送到远程源的根目录。

我想将 /wordpress/ 文件夹移动到项目的根目录,但是所有 Vagrant 文件都将被推送到生产服务器(除非有办法添加特定于远程来源的 .gitignore)。

我确信有几种方法可以做到这一点,我还查看了 git subtrees,但对于这个特定问题,它看起来有点矫枉过正。如果有人可以提出最佳解决方案,将不胜感激。

4

1 回答 1

7

间接的、流氓的答案是,这git不是一个部署工具。所以你应该使用 phing,或者 capistrano,或者 ant,或者 puppet,或者 chef,或者 ansible,或者 grunt,或者只是写一些 bash 脚本等等。

简短的回答是git-subtree split。我会和这个一起去的。

说明

如果您真的不知道发生了什么,子树,甚至子模块,可能会令人困惑。通常,它们用于模块化开发,作为子模块的替代方案。我不会深入讨论,因为在这种情况下你不会使用它。

出于您的目的,您将执行所谓的 asubtree 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

是的,子树分裂有时仍然参差不齐。如果由于某种原因 subtree 命令不适合您,那没关系。您可以使用更旧的、更令人困惑的git-filter-branch命令。有关该命令的完整说明,请参见此处

如果你坚持这个选择,那么..那很臭。你可能最好只使用子模块(如果你在这一点上可能要走的路),或者编写一些bash脚本将文件复制到你本地的不同仓库并推送......或其他可怕的东西。

或者您可以只使用真正的部署工具。

于 2014-03-02T07:28:14.783 回答