Git提交到公共子模块(主分支)

Git提交到公共子模块(主分支),git,commit,git-submodules,Git,Commit,Git Submodules,我有两个或两个以上的项目(我们称它们为ProjectFoo和ProjectBar),它们有一些公共代码,我把它们放在子模块中 我的理解是,如果我从ProjectFoo内部提交对子模块的更改,它将位于只有所有ProjectFoo克隆才能看到的分离头中: (master) $ cd ProjectFooBarCommoneSubmodule/ (master) $ git commit -am "Common code fix." (56f21fb0...) $ git push Everythin

我有两个或两个以上的项目(我们称它们为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合并所有最新内容的事情,但这看起来很难看。可能是git重置--hard master也会这么做,但看起来更难看

如何让项目共享一个公共代码,并从使用它的项目内部更新?换句话说,提交到该子模块应该更新使用该子模块的所有不同存储库(存储库,而不仅仅是克隆)

----编辑----

很明显,我签出的存储库被弄乱了。它应该从一开始就这样工作(在本例中,在ProjectFoo上):

然后,要从其他项目(如ProjectBar)中获得更改,请执行以下操作:

git submodule status
将更新为最新的通用代码。如果git checkout master位于分离的磁头上,则可能需要一个
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
-6850e4e4c1fac49de39890703f21486ca04b87a0普通

在ProjectBar中:

git submodule status
-6850e4e4c1fac49de39890703f21486ca04b87a0普通

所以两者都指向相同的修订,对吗?这里的诀窍是要看到,ProjectFoo和ProjectBar指向修订版(6850e4e4c1fac49de39890703f21486ca04b87a0)而不是分支(master),尽管它们是相同的东西。第一个是分离的头部,另一个是命名的分支

如果要对ProjectFoobarCommonesSubmodule执行某些修复,可以转到ProjectFoo中的子目录,然后选择分支而不是修订版

git checkout master 
<Do your coding and pushing here>
+e24bd2bf45d52171a63b67ac05cd4be0ac965f60通用型(heads/master-1-ge24bd2b)

现在您可以执行git add,设置对该特定提交的引用(ge24bd…),执行提交,然后子模块引用指向该修订版,该修订版恰好也是ProjectFooBarCommoneSubmodule上的master

现在还需要更新ProjectBar中的引用。转到ProjectBar/common,执行git获取原点(这是一个快进合并),执行


因此,与任何git存储库一样,您不需要在分离的头部上工作。您可以使用master,也可以创建命名分支。无论哪种方式,都要确保上游包含ProjectFoobarCommonesSubmodule更改,否则,如果ProjectFoo和ProjectBar引用的内容不存在,您将同时中断它们。希望这能更好地解释
子模块上的:
git push origin HEAD:master
如果要同时提交并推送所有子模块,请执行以下操作:

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

要将已从分离的磁头合并到主磁头,请运行:

git rebase HEAD master
然后检查主控台(使用
-f
强制):

如果要处理多个子模块,请使用:
gitsubmoduleforeach
,例如

git submodule foreach git pull origin master -r
我只是:

每个git push-u源主机的git子模块

git submodule foreach 'git commit -a'
如果其中一个子模块不包含要执行的提交,则将失败

要消除此问题,必须强制命令结果为0

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

通过使用echo管道,您可以强制整个命令返回0,并继续在其他子模块上执行commit命令

谢谢,我看到了这一章。遗憾的是,我没有找到一个明确的答案来回答我的问题。你说没有自动使用主控,那么如果一个公共子项目,比如说一个库,更新了怎么办?
git子模块更新
不是要更新依赖于该库的所有项目吗?我想做同样的事情,但是直接从我的任何一个主要项目更新这个库。如果这是不可能的,那么还有什么选择呢?Git存储库不包含任何关于谁克隆了它们的信息。这就是为什么不可能将更改推送到所有克隆。简单地说,我认为您期望的是符号链接之类的东西,所以任何东西都会立即传播,而克隆更像是“tar、gzip、copy、unzip”。关键可能是在Foo和Bar中发布更改后的修订号。任何获取更改的人都将在下次看到更改的修订号。我会说,没有比这更好的了。不过,我很高兴在这方面被证明是错误的。当然,克隆人必须进行更新或手动拉取。我的问题是,怎么做?两个项目,而不是克隆,在Git子模块中共享一个公共代码。除了ProjectFoo将子模块提交到分离的头部,然后ProjectBar(不是克隆)合并更改(如果可能的话,我不知道这些更改存储在哪里)之外,还有其他选择吗?这是一个如此痛苦的过程,如此之长。顺便说一句,在git提交--all-m“大量修复”
之后,子模块中缺少了一个
git推送
。否则它将不会反映在其他项目中。如果像我一样,您愚蠢地将子模块中的更改提交给分离的head,那么您可以
git checkout master
,然后
git merge 61c9bf6
或任何提交的引用。
git rebase HEAD master
git checkout master
git submodule foreach git pull origin master -r
git submodule foreach 'git commit -a'
git submodule foreach "git commit -am 'your comment' || echo ' '"