我有一个引用多个子模块的git超级项目,我正在尝试锁定其他项目成员的工作流程。
对于这个问题,假设我的超级项目被称为supery
,子模块被称为subby
。 (然后是我正在尝试做的简化......我实际上并没有使用分支版本,但我认为最简单的问题就是布局。)
我的supery
主分支将git项目v1.0
的标记subby
作为子模块引用。 supery
的分支名为one.one
,并将子模块的引用更改为指向v1.1
的代码subby
。
我可以毫不费力地在每个分支中工作,但是如果我尝试使用one.one
分支的更改来更新master
分支,我会收到一些冲突而我不知道如何解决它们。
基本上在git pull . master
分支中运行subby
后,看起来它会创建其他子模块。
在拉/合并之前,我从git submodule
分支机构的one.one
获得了所需的响应:
$ git checkout master
$ git submodule
qw3rty...321e subby (v1.0)
$ git checkout one.one
$ git submodule
asdfgh...456d subby (v1.1)
但是在拉动之后,当我运行git submodule
时,它会添加额外的子模块:
$ git pull . master
Auto-merged schema
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e
Automatic merge failed; fix conflicts and then commit the results.
$ git submodule
qw3rty...321e subby (v1.0)
asdfgh...456d subby (v1.1)
zxcvbn...7890 subby (v1.1~1)
如何删除/忽略不需要的子模块引用并提交我的冲突和更改?或者我可以使用我的原始git pull
可以忽略我的子模块的参数吗?
答案 0 :(得分:71)
好吧,它在技术上没有管理与子模块的冲突(即:保留这个而不是那个),但我找到了继续工作的方法......我所要做的就是关注我的git status
输出并重置子模块:
git reset HEAD subby
git commit
这会将子模块重置为预拉提交。在这种情况下,这正是我想要的。在其他我需要应用于子模块的更改的情况下,我将处理那些具有标准子模块工作流程(结账主数据,下拉所需标签等)。
答案 1 :(得分:35)
我对这个问题的答案有点挣扎,并且a similar SO post中的答案也没有太多运气。所以这对我有用 - 请记住,在我的情况下,子模块由不同的团队维护,因此冲突来自master和我正在研究的项目的本地分支中的不同子模块版本:
git status
- 记下带有冲突的子模块文件夹将子模块重置为当前分支中最后提交的版本:
git reset HEAD path/to/submodule
此时,您的子模块有一个无冲突的版本,您现在可以在子模块的存储库中更新到最新版本:
cd path/to/submodule git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
现在你可以commit
然后重新开始工作。
答案 2 :(得分:17)
之前我没有看到过那个确切的错误。但我猜你遇到的麻烦。这看起来是因为master
的{{1}}和one.one
分支包含supery
子模块的不同引用,当您从subby
合并更改时,git不知道哪个引用master
或v1.0
- 应由v1.1
的{{1}}分支保留和跟踪。
如果是这种情况,那么您需要选择所需的ref并提交该更改以解决冲突。这正是您使用 reset 命令所做的。
在项目的不同分支中跟踪子模块的不同版本是一个棘手的方面。但子模块ref与项目的任何其他组件一样。如果两个不同的分支在连续合并之后继续跟踪相同的相应子模块refs,那么git应该能够计算出模式而不会在将来的合并中引发合并冲突。另一方面,如果经常切换子模块,你可能不得不忍受大量的冲突解决。
答案 3 :(得分:13)
首先,找到要引用子模块的哈希值。然后运行
~/supery/subby $ git co hashpointerhere
~/supery/subby $ cd ../
~/supery $ git add subby
~/supery $ git commit -m 'updated subby reference'
这对我来说是有用的,可以让我的子模块得到正确的哈希引用,并继续我的工作,而不会产生任何进一步的冲突。
答案 4 :(得分:9)
我的git rebase -i origin/master
问题出现了问题。我想采用主模块的子模块参考,所以我只是做了:
git reset master path/to/submodule
然后
git rebase --continue
这解决了我的问题。
答案 5 :(得分:2)
从这次讨论中获得帮助。
git reset HEAD subby
git commit
为我工作:)
答案 6 :(得分:1)
在我的父目录中,我看到:
PYTHONPACKAGES
所以我就这样做了
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)
答案 7 :(得分:1)
如果要使用上游版本:
rm -rf <submodule dir>
git submodule init
git submodule update