问题 Git:如何将子目录推送到同一存储库的单独分支


我正在处理的当前项目仅限于一个git存储库。 我当前的工作目录看起来像这样:

dist/
  *distribution files

src/
  *src files

我们设置了Azure服务器,以自动部署推送到我们仓库的“部署”分支的任何内容。因此,目标是将src文件推送到master并将dist文件夹的内容推送到'deploy'分支。

到目前为止我一直在做的是分支master,删除src文件夹,并在推送部署之前将dist文件夹的内容移动到root。

我知道理想情况下我们会有单独的回购,但目前这不是一个选择。有更简单的方法吗?


886
2017-09-16 19:13


起源



答案:


git的子树 命令对此很有用。从你的 master 分支做:

git subtree split --branch deploy --prefix dist/

每次要更新时都要运行该命令 deploy 科。它将合并每个提交 dist subdir(当前分支 - 大概是 master)到根的 deploy 分支并维护完整的提交历史记录。请注意,只有更改 dist subdir将被合并。如果提交包括更改 dist repo中的subdir和其他文件,只有更改 dist subdir包括在内。

棘手的部分是安装。据我了解,该命令包含在git 1.7.11及更高版本中。但是,它位于“contrib”子树中,因此默认情况下不会安装。在系统的软件包管理器中搜索“git-subtree”并安装软件包(如果存在)。如果没有,或者你使用的是旧版本的git,我发现最简单的方法就是从作者那里安装git-subtree 回购

git clone https://github.com/apenwarr/git-subtree.git
cd git-subtree/
make install

一旦你安装它,你可以用它做各种很酷的事情,如中所述 文档


11
2017-09-16 19:39



工作得很好。谢了哥们。 - Lawren
有没有办法做同样的事情,但是当构建文件或 dist 在... .gitignore 并且不让主人?为了澄清,我只想在deploy分支中使用dist文件,并且只想在master中使用src文件。 - Lawren
@Lawren我有同样的情况,因为 dist 在... .gitignore,你有解决方案吗? - vanio178


答案:


git的子树 命令对此很有用。从你的 master 分支做:

git subtree split --branch deploy --prefix dist/

每次要更新时都要运行该命令 deploy 科。它将合并每个提交 dist subdir(当前分支 - 大概是 master)到根的 deploy 分支并维护完整的提交历史记录。请注意,只有更改 dist subdir将被合并。如果提交包括更改 dist repo中的subdir和其他文件,只有更改 dist subdir包括在内。

棘手的部分是安装。据我了解,该命令包含在git 1.7.11及更高版本中。但是,它位于“contrib”子树中,因此默认情况下不会安装。在系统的软件包管理器中搜索“git-subtree”并安装软件包(如果存在)。如果没有,或者你使用的是旧版本的git,我发现最简单的方法就是从作者那里安装git-subtree 回购

git clone https://github.com/apenwarr/git-subtree.git
cd git-subtree/
make install

一旦你安装它,你可以用它做各种很酷的事情,如中所述 文档


11
2017-09-16 19:39



工作得很好。谢了哥们。 - Lawren
有没有办法做同样的事情,但是当构建文件或 dist 在... .gitignore 并且不让主人?为了澄清,我只想在deploy分支中使用dist文件,并且只想在master中使用src文件。 - Lawren
@Lawren我有同样的情况,因为 dist 在... .gitignore,你有解决方案吗? - vanio178