Git提交公共子模块(master branch)

时间:2010-08-28 10:32:32

标签: git commit git-submodules

我有两个或更多项目(我们称之为 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

6 个答案:

答案 0 :(得分:66)

简短回答:

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:s的角度来预测。依赖关系不能改变,除非有人决定将更改合并到项目A中。所有类型的讨厌的事情都可能发生,项目B:自动导入的更改,其中编译错误可能是最好的,因为A会立即注意到失败。这就是B:头部处于分离状态的原因。

B的状态存储在A中(签出git submodule status),并且必须在A中完成并提交修订更改,以使其具有任何效果。这是上面示例中发生的情况,A更改存储在repo中的修订号,并将版本更新为最新版本。该过程也必须在另一个主回购中重复,因此没有自动“使用主”切换AFAIK。

顺便说一句。 Git book chapter on submodulessubmodule man page包含许多关于子模块的有用信息,包括正常用法和典型陷阱。值得一试。


编辑:我会尝试更好地解释

我冒昧地在my github account上创建示例项目。提交没有意义,包含垃圾,但设置应该没问题。请检查一下。

ProjectFoo和ProjectBar共享公共子模块中的代码。

ProjectFooBarCommoneSubmodule:master 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子模块状态。它应该告诉你,你现在已经不同步了。 E.g

git submodule status

+ e24bd2bf45d52171a63b67ac05cd4be0ac965f60 common(heads / master-1-ge24bd2b)

现在你可以做一个git add,设置对这个特定提交的引用(ge24bd ...),做一个提交,然后子模块引用指向这个版本,它也恰好是ProjectFooBarCommoneSubmodule上的master。

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

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存储库一样,您不需要处理分离的头。您可以使用master,也可以创建命名分支。无论哪种方式,确保上游包含ProjectFooBarCommoneSubmodule更改,或者如果它们引用了不存在的内容,您将破坏ProjectFoo和ProjectBar。希望这能更好地解释

答案 1 :(得分:3)

git push origin HEAD:master jQuery.sap.includeScript("externalLibrary.min.js", function() { //initalizing objects from library });

答案 2 :(得分:0)

如果要一次提交并推送所有子模块,请执行以下操作:

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

答案 3 :(得分:0)

要将已从已分离的HEAD更改为master,请运行:

git rebase HEAD master

然后结帐主人(使用-f强制执行):

git checkout master

如果您要处理多个子模块,请使用:git submodule foreach,例如

git submodule foreach git pull origin master -r

答案 4 :(得分:0)

我只是这样做:

git submodule foreach git push -u origin master

答案 5 :(得分:0)

注意:

git submodule foreach 'git commit -a'
如果其中一个子模块没有提交,

将失败。

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

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

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