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

15

我目前工作的项目仅限于一个 Git 存储库。我的当前工作目录大致如下:

dist/
  *distribution files

src/
  *src files

我们已经设置了一个Azure服务器,可以自动部署推送到存储库的'deploy'分支的所有内容。因此,目标是将src文件推送到主分支,将dist文件夹的内容推送到'deploy'分支。

直到现在,我的做法是从主分支创建分支,删除src文件夹,将dist文件夹的内容移动到根目录,然后推送到'deploy'分支。

我知道理想情况下我们应该有单独的仓库,但目前这不是一个选项。有没有更简单的方法做到这一点?

1个回答

22

对此,git-subtree 命令非常适用。从您的 master 分支执行以下操作:

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

每次想要更新deploy分支时,请运行该命令。它将合并当前分支(可能是master)中dist子目录下的每个提交到deploy分支的根,并保留完整的提交历史记录。请注意,只有dist子目录中的更改将被合并。如果一个提交包括对dist子目录和存储库中其他文件的更改,则只包括dist子目录中的更改。

麻烦的部分在于安装。据我了解,该命令已包含在 git 1.7.11 及更高版本中。然而,它位于“contrib”子树中,因此默认情况下不会安装。在系统的软件包管理器中搜索“git-subtree”,如果存在该软件包则安装。如果没有或者您使用的是较旧版本的git,则我发现最简单的方法是从作者的repo安装git-subtree。

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

安装完成后,您可以根据文档中的说明进行各种酷炫操作。


完美地工作了。谢谢伙计。 - Lawren
7
有没有一种方法可以做同样的事情,但是当构建文件或dist.gitignore中并被排除在主分支之外时?澄清一下,我希望部署分支仅包含dist文件,而主分支仅包含src文件。 - Lawren
@Lawren 我有同样的情况,因为 dist.gitignore 中,你解决了吗? - vanio178
两年后,我还有同样的需要。你解决了吗? - Danielo515
这个问题涉及到git repo的子目录,而不是被排除在git repo之外的目录。如果你想要用作源的目录在.gitignore中,那么这对你来说是行不通的。事实上,那将是一个完全不同的问题,与此处所问的问题无关。 - Waylan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接