将git子树中的更改推送到用于拉取请求的分支

12
如何在本地创建对git子树的更改,并将这些更改推送到子树存储库中的一个分支中,以便我可以随后创建拉取请求,将该分支中的更改合并到子树的主干中?
假设我有两个存储库,project和protocols,两者都在我的控制之下。
步骤1:将protocols作为子树添加到project存储库中。
$ git remote add protocols git@bitbucket.org:corp/protocols.git

$ git remote
origin
protocols

$ git subtree add --prefix=protocols protocols master --squash
...
From bitbucket.org:corp/protocols
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> protocols/master
Added dir 'protocols'

步骤2:在项目库中对位于协议子树中的文件进行一些更改

$ cd protocols
$ echo "foo" > some_file
$ git commit -a -m "added foo"

步骤 3:在 protocols 子仓库中创建一个分支,并将本地的 project/protocols 更改推送到该分支

我不确定如何最好地实现这一步...

一旦我的 subtree 更改成功推送到远程 protocols 仓库中的一个分支,我就可以创建一个 pull 请求,将这些更改合并回 protocolsmaster 分支。

问题:

  • 我有一个本地副本的 protocols。 我应该切换到该仓库,创建一个分支,然后切换回 project 并将 subtree 更改推送到本地 protocols 仓库吗?

  • 我是否可以直接将 subtree 更改推送到我本地 protocols 仓库中一个尚未创建的新分支中?

  • 我是否可以直接将 subtree 更改推送到远程 protocols 仓库中一个尚未创建的新分支中?

  • 这是一个推荐的工作流吗?

1个回答

11

创建一个分支在protocols仓库,并将我本地的project/protocols子目录更改推送到该分支

你可以使用单个命令subtree push来实现,指定一个新的远程分支:

$ git subtree push --prefix=protocols protocols feature

这将在远程仓库的 protocols 中创建一个名为 feature 的新分支。

现在,您可以创建一个拉取请求,将 feature 分支合并回 protocols 的 master 分支。

一旦分支被合并,您可以使用 --squash 选项进行 pull 来更新您的子树。

$ git subtree pull --prefix=protocols protocols master --squash

这将创建另一个提交(commit),其中包含protocols仓库中所有更改的合并(squashed)版本,然后再进行合并提交(merge commit)以合并到您的project仓库中。

请注意,此方法有一个小问题,即现在将在您的project仓库中存在两个包含protocols仓库更改的提交(commit)。

  • project仓库的protocols子目录中创建的原始提交(commit)
  • 由后续子树拉取(subtree pull)创建的提交(commit)(通常与其他协议更改一起,假设使用了--squash)

我使用了显式的 git subtree split 命令,然后使用 git push 将子树推送到其原始仓库。这个方法“基本上”可行,但是会导致一个无法合并到主分支的孤立分支,因此我无法像你建议的那样“创建拉取请求”。你有什么想法吗?谢谢! - yoyo
@yoyo,很抱歉我从未使用过显式的“subtree split”,所以无法提供帮助! - Steve Lorimer
3
将此推送到子树仓库将项目分支的所有历史记录都带到协议功能分支,是否有避免这种情况的解决方案? - Richa Dua
@RichaDua 我没有 - 你找到避免它的方法了吗? - Steve Lorimer
@SteveLorimer 我找到了一种使用子树策略合并的解决方案。每当团队中有新成员克隆带有子树链接的 repo 时,他们不再拥有该映射,所以我找到的解决方案是使用子树策略合并来拉取和推送对子树 repo 的更改。例如,从子树 repo 拉取更改的步骤如下: 1. git checkout -b <feature_branch> 2. git remote add -f <remote_name> <subtree repo url> 3. git merge --squash -s subtree --allow-unrelated-histories --no-commit <remote_name>/dev 4. 添加、提交和推送功能分支。 - Richa Dua
这样做我的 Pull Request 无法合并。当试图合并“不相关的分支”时,我的 SCM 会抛出此错误。 - red888

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