git的承诺到公共子模块(主分支)git的承诺到公共子模块(主分支)(Git commit to c

2019-05-13 06:54发布

我有两个或两个以上的项目(我们姑且称之为ProjectFooProjectBar)具有我把一个子模块一些共同的代码

我的理解是,如果我承诺从内部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 ,如果是在一个分离的头可能是必需的。

Answer 1:

简短的回答:

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,如果他们引用的东西并不存在。 希望这会更好地解释它



Answer 2:

submodulegit push origin HEAD:master



Answer 3:

合并来自分离的头到主变,运行:

git rebase HEAD master

然后结帐主(使用-f为力):

git checkout master

如果你有多个子模块来处理,使用: git submodule foreach ,如

git submodule foreach git pull origin master -r


Answer 4:

我只是做:

git submodule foreach git push -u origin master



Answer 5:

注意:

git submodule foreach 'git commit -a'

如果子模块的一个containt没有承诺做会失败。

为了摆脱这种情况,必须在命令结果强制为0。

git submodule foreach "git commit -am 'your comment' || echo ' '"

通过使用echo通过管道将强制整个命令0返回并继续对其它子模块执行commit命令



Answer 6:

如果你想提交和一次推送所有子做的:

git submodule foreach 'git commit -a' ;
git submodule foreach 'git push --all' ;
git commit -a && \
git push --all --recurse-submodules=on-demand


文章来源: Git commit to common submodule (master branch)