问题描述
在GitHub上有一个git仓库,其中一个子树是从上游仓库的某个分支合并而来的(使用子树合并策略);然后在用户的仓库中对该子树进行了定制。不时地,需要将上游分支中的更新合并到用户的仓库中:使用(捆绑的)子树contrib脚本可以很容易地完成这个操作。很好。
然而,与其手动定期检查上游,我真的希望设置一些自动化的东西,可以为我完成大部分这个繁琐的工作。我的仓库托管在GitHub上,所以理想情况下,这种自动化(可能是一个GitHub Action)将简单地打开一个合并请求,以合并任何更新。
不幸的是,上游的更新通常会导致合并冲突,而git subtree pull
显然希望在合并完成之前解决这些冲突。但这显然需要手动干预。
我想我真正想要的是一个合并请求,”使用子树合并策略合并提交”,然后GitHub会识别出该策略引起的任何冲突,并要求审阅者在合并之前解决这些冲突。但这不是GitHub目前提供的功能。
那么我的选择是什么?只是打开一个问题通知上游提交正在等待合并,并提示使用一个Action手动进行git subtree pull
,一旦这些提交被合并,关闭问题?也许有一些工具可以在相关的PR上叠加一个”子树合并”UI?或者可能是其他完全不同的东西?
感谢您的想法/建议。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在GitHub上使用子树合并请求的一个选择是使用GitHub Actions来自动化这个过程。以下是一种可能的解决方案:
1. 创建一个新的GitHub Action工作流程,该工作流程将在上游分支有更新时触发。
2. 在工作流程中,使用git subtree pull
命令将上游分支的更新合并到您的仓库中的子树中。
3. 如果合并过程中出现冲突,GitHub将自动创建一个合并请求,并将冲突标记为需要解决。
4. 通过在合并请求中进行审阅和解决冲突,您可以手动完成合并过程。
以下是一个示例的GitHub Actions工作流程文件,用于在上游分支有更新时自动合并子树:
name: Merge Subtree Updates
on:
push:
branches:
- main
jobs:
merge_subtree_updates:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Merge subtree updates
run: |
git subtree pull --prefix=subtree_directory upstream_branch
在上面的示例中,我们创建了一个名为”Merge Subtree Updates”的工作流程,它将在main
分支有更新时触发。工作流程的步骤包括检出仓库和使用git subtree pull
命令将上游分支的更新合并到名为subtree_directory
的子树中。
请注意,这只是一个示例,您需要根据您的实际情况进行适当的修改。
方案2
如果您希望在合并请求中使用子树合并策略,并且希望GitHub自动识别冲突并要求审阅者解决冲突,目前GitHub并不直接支持这个功能。但是,您可以使用一些工具来模拟这个过程。
一个可能的解决方案是使用git-subtree-pr
工具,它是一个第三方工具,可以帮助您在GitHub上使用子树合并策略。以下是使用git-subtree-pr
的步骤:
1. 安装git-subtree-pr
工具。您可以在其GitHub存储库中找到安装说明。
2. 使用git-subtree-pr
命令创建一个合并请求,该合并请求将使用子树合并策略合并提交。
3. 如果合并过程中出现冲突,您可以在合并请求中手动解决冲突。
4. 一旦冲突解决完毕,您可以请求审阅者审阅并合并合并请求。
请注意,git-subtree-pr
是一个第三方工具,使用它可能需要一些额外的学习和配置。您可以在其GitHub存储库中找到更多关于如何使用该工具的信息和示例。
方案3
如果您不想使用GitHub Actions或第三方工具,并且愿意手动处理子树合并请求,您可以通过在GitHub上打开一个问题来通知上游提交正在等待合并,并使用一个Action手动进行git subtree pull
。以下是一种可能的解决方案:
1. 在GitHub上打开一个问题,标题为”上游提交等待合并”,并在问题描述中提醒其他贡献者进行git subtree pull
操作。
2. 创建一个GitHub Action工作流程,该工作流程将在问题关闭时触发。
3. 在工作流程中,使用git subtree pull
命令将上游分支的更新合并到您的仓库中的子树中。
4. 一旦合并完成,关闭问题。
请注意,这种方法需要手动处理子树合并请求,并且需要其他贡献者进行git subtree pull
操作。这可能需要一些额外的协调和沟通。
以上是几种可能的解决方案,您可以根据您的需求和偏好选择适合您的方法。希望这些解决方案对您有帮助!