我有两个或两个以上的项目(我们姑且称之为ProjectFoo和ProjectBar)具有我把一个子模块一些共同的代码 。
我的理解是,如果我承诺从内部ProjectFoo变为一个子模块,它会成为一个分离的头,只有所有ProjectFoo克隆可以看到:
(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git commit -am "Common code fix."
(56f21fb0...) $ git push
Everything up-to-date
这可能是因为master
分支并没有改变。 我大概可以做类似git checkout master && git merge Everything up-to-date
,但似乎很丑陋。 可能是git reset --hard master
会做同样的,但它似乎甚至丑陋。
如何有由项目共享的公共代码,使用它的项目内更新? 换句话说,提交到子模块应该更新使用相同的子模块的所有各种信息库( 库,而不仅仅是克隆 )。
---- ----编辑
可见我签出库一塌糊涂和破碎。 应该从一开始(在这个例子上ProjectFoo)工作过这样的:
(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git commit -am "Common code fix."
(master) $ git push
....
fbfdd71..0acce63 master -> master
(master) $ cd ..
(master) $ git add ProjectFooBarCommoneSubmodule
(master) $ git commit -m "Submodule update."
然后获得从其他项目,如ProjectBar这种变化:
(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git pull
将更新到最新的通用代码。 一个git checkout master
,如果是在一个分离的头可能是必需的。
简短的回答:
cd ProjectFooBarCommoneSubmodule
git checkout master
<Do your editing>
git commit --all -m "Lots of fixes"
git push submodule_origin master
cd ..
git add ProjectFooBarCommoneSubmodule
git commit -m "Bumped up the revision of ProjectFooBarCommoneSubmodule"
git push origin master
较长的一个:
git的子模是一个依赖机制,其中,所述主项目(比如说A)定义了一个子项目指定的修订(说B),这将在建筑项目A.使用为了使工具是行为必须是可预测的有用从A:的视点。 依赖关系无法改变,除非有人决定更改合并项目A.各种讨厌的事情都可能发生,为项目B:变迁自动导入,它的编译错误都可能是最好的,作为一个马上会注意到故障。 这就是为什么B:头部保持在分离状态。
B的状态是A(检查专卖店git submodule status
),以及修正的变化有许多工作要做,并承诺在A,以便它有任何影响。 这是在本例中发生的事情中,A改变存储在回购协议的版本号,以及突出了版本为最新。 该过程将在另一个主回购要重复一样,所以没有自动“使用主”开关AFAIK。
BTW。 该对Git的子模块书章节和子模块手册页包含大量的有关子模块有用的信息,如正常使用和典型的缺陷也是如此。 值得一试。
编辑:我会试着解释这更好
我冒昧上创建示例项目我的github帐户 。 在提交毫无意义,而且含有垃圾,但是设置应该罚款。 请检查出来跟随。
无论ProjectFoo和ProjectBar分享共同的子模块的代码。
ProjectFooBarCommoneSubmodule:大师是6850e4e4c1fac49de398
在ProjectFoo:
git submodule status
-6850e4e4c1fac49de39890703f21486ca04b87a0常见
在ProjectBar:
git submodule status
-6850e4e4c1fac49de39890703f21486ca04b87a0常见
所以,都指向同一个版本,对不对? 这里的关键是要看到,ProjectFoo和ProjectBar指向修订 (6850e4e4c1fac49de39890703f21486ca04b87a0) 未分公司 (主),尽管它们是同一个东西。 第一个是一个分离的头,另一名为分支。
如果你想要做一些ProjectFooBarCommoneSubmodule固定,你可以去如ProjectFoo的子目录,并选择分支,而不是修订 :
git checkout master
<Do your coding and pushing here>
然后进入一级目录,并检查git的子模块的状态。 它应该告诉你,你现在不同步。 例如
git submodule status
+ e24bd2bf45d52171a63b67ac05cd4be0ac965f60常见(头/主-1- ge24bd2b)
现在,你可以做一个git的添加,设置参考,以这种特殊的提交(ge24bd ...),做一个承诺,而在此之后,子模块的参考点到此版本,这也恰好是主上ProjectFooBarCommoneSubmodule。
现在,你需要更新ProjectBar参考为好。 转到ProjectBar /常见,也混帐取原点(这是一个快进合并),做
git checkout master
cd ..
git add common
git commit -m "Bumped up the revision"
git push origin master # to publish the revision bump to everybody else
因此,对于任何的Git仓库,你不必在一个分离的头工作。 您可以在主工作,或者创建一个名为分支。 无论哪种方式,确保上游包含ProjectFooBarCommoneSubmodule变化,否则你会打破双方ProjectFoo和ProjectBar,如果他们引用的东西并不存在。 希望这会更好地解释它
在submodule
: git push origin HEAD:master
合并来自分离的头到主变,运行:
git rebase HEAD master
然后结帐主(使用-f
为力):
git checkout master
如果你有多个子模块来处理,使用: git submodule foreach
,如
git submodule foreach git pull origin master -r
我只是做:
git submodule foreach git push -u origin master
注意:
git submodule foreach 'git commit -a'
如果子模块的一个containt没有承诺做会失败。
为了摆脱这种情况,必须在命令结果强制为0。
git submodule foreach "git commit -am 'your comment' || echo ' '"
通过使用echo通过管道将强制整个命令0返回并继续对其它子模块执行commit命令
如果你想提交和一次推送所有子做的:
git submodule foreach 'git commit -a' ;
git submodule foreach 'git push --all' ;
git commit -a && \
git push --all --recurse-submodules=on-demand