我有两个或更多项目(我们称之为 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
。
答案 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 submodules和submodule 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命令