git - 如何 merge 子模块并始终保持 "ours"?

标签 git merge git-submodules

我有一个 git 仓库,第二个仓库作为子模块。这两个 repos 都有对应的各种功能的分支,这些分支通常非常直接地对应,例如如果父仓库在分支 A 上,子模块也将在分支 A 上。

在父模块和子模块 repos 中,随着时间的推移添加了更多分支,有时我将旧分支 merge 到后面的分支中,例如在两个 repos 中定期将分支 A merge 到分支 B,而分支 B 也获得不在 A 中的新提交。

当我在更新 A 子模块后将分支 A merge 到父仓库的 B 时,问题就来了。我想忽略这些更新(即我总是想在 merge 期间丢弃子模块更新,否则父分支 B 可能以子模块分支 A 结束,这是错误的)。

我找到了一些 instructions关于如何在 merge 文件 时始终使用“我们的”,但它似乎对子模块无效。以下是使用子模块重现问题的方法:

# first command will update your ~/.gitconfig, you may want to undo it later
git config --global merge.ours.driver true

mkdir -p tmp/sub
cd tmp
git init
git commit --allow-empty -m "chore: Initial commit"
echo 'sub merge=ours' >> .gitattributes
git add .gitattributes
git commit -m 'chore: Preserve sub during merges'

mkdir sub
pushd sub
git init
git commit --allow-empty -m "sub: init"
popd
git submodule add ./sub
git commit -m 'add submodule'

git checkout -b demo-prod
pushd sub
echo prod > readme
git add readme
git commit -m 'add prod readme'
popd
git commit sub -m 'sub: add prod readme'

git checkout -
git submodule update
pushd sub
echo master > log
git add log
git commit -m 'add master log'
popd
git commit sub -m 'sub: add master log'

git checkout demo-prod
git merge -

预期结果是自动 merge ,但实际结果是 merge 冲突,因为“sub”在父仓库的两个分支中都有新的提交。

在这种情况下如何实现简单的 merge ?

最佳答案

t7405-submodule-merge.sh 中测试了与子模块的 merge , 它总是包含一个 merge -s ours ,它应该做你想做的事。
(测试添加于 commit f37ae35,2009 年 4 月,Git v1.6.2.4)

子模块的实际 merge was discussed in Nov. 2017 , 对于 this patch , 在 commit 6c8647d ,2018 年 1 月,v2.17.0-rc0,但您在这里不需要它。

使用 merge strategy "-s ours"可能太多了(因为它忽略了来自其他分支的 all 提交),但 merge 递归策略选项可能会有所帮助:git merge -X 我们的

关于git - 如何 merge 子模块并始终保持 "ours"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58006649/

相关文章:

git - 将 pull 请求 merge 到不同的分支

ios - 在 .gitmodules 中找不到子模块路径 'Pods' 的 url

.net - 使用 VS 解决方案的 git 子模块时如何解析 nuget 包

git:自动 merge 与正常(不冲突) merge ?

merge - Gerrit 在提交补丁集之前总是 rebase 以避免合并提交

git - 重命名一个 git 子模块

windows - 无法使用来自 jenkins 的 git 从 tomcat 安装连接到 bitbucket

git - 无法一开始就使用 git@github.com 克隆存储库?

c# - mono-repo 中包的独立版本控制

git - 将相同的文件重命名更改应用于不同的 GIT 分支