Git 提交到公共子模块(主分支)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3590400/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Git commit to common submodule (master branch)
提问by Wernight
I've two or more projects (let's call them ProjectFooand ProjectBar) having some common codethat I put in a submodule.
我有两个或多个项目(我们称它们为ProjectFoo和ProjectBar)有一些我放在submodule 中的通用代码。
My understanding is that if I commit changes to a submodule from within ProjectFooit'll be in a detached head that only all ProjectFooclones can see:
我的理解是,如果我从ProjectFoo 中提交对子模块的更改,它将位于一个分离的头部,只有所有ProjectFoo克隆才能看到:
(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git commit -am "Common code fix."
(56f21fb0...) $ git push
Everything up-to-date
That's probably because the master
branch hasn't changed. I could probably do something like git checkout master && git merge Everything up-to-date
but that seem pretty ugly. May be a git reset --hard master
would do the same but it seems even uglier.
那可能是因为master
分支没有改变。我可能会做类似的事情,git checkout master && git merge Everything up-to-date
但这看起来很丑陋。可能git reset --hard master
会做同样的事情,但它似乎更丑陋。
How to have a common code shared by project, updated from withinthose projects using it? In other words, committing to that submodule should update all various repositories (repositories, not just clones) that use this same submodule.
如何让项目共享公共代码,并从使用它的项目中更新?换句话说,提交到该子模块应该更新使用相同子模块的所有各种存储库(存储库,而不仅仅是克隆)。
---- EDIT ----
- - 编辑 - -
Visibly my checked-out repository was messed up and broken. It should have worked right from the start like that (on ProjectFooin this example):
显然,我签出的存储库被弄乱了并损坏了。它应该从一开始就可以正常工作(在本例中是在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."
Then to get that change from on other projects, like ProjectBar:
然后从其他项目中获取更改,例如ProjectBar:
(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git pull
Would update to the latest common code. A git checkout master
may be required if it's on a detached head.
将更新到最新的通用代码。git checkout master
如果它位于分离的头部,则可能需要A。
回答by Kai Inkinen
Short answer:
简短的回答:
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
The longer one:
较长的一个:
Git submodules are a dependency mechanism, where the main project (say A) defines a specified revision in a subproject (say B), which will be used in building project A. In order for the tool to be useful the behavior has to be predictable from A:s point of view. Dependencies cannot change, unless somebody decides to incorporate the change to project A. All kinds of nasty things could happen, were project B:s changes automatically imported, of which compile errors are probably the best ones, as A would notice the failures immediately. This is why B:s head is kept in detached state.
Git 子模块是一种依赖机制,其中主项目(比如 A)在子项目(比如 B)中定义了一个指定的修订版本,它将用于构建项目 A。为了使工具有用,行为必须是可预测的从 A:s 的角度来看。依赖项不会改变,除非有人决定将更改合并到项目 A 中。各种令人讨厌的事情都可能发生,如果项目 B:s 更改自动导入,其中编译错误可能是最好的,因为 A 会立即注意到失败。这就是为什么 B:s 的头保持分离状态的原因。
The state of B is store in A (check out git submodule status
), and a revision change has to be done and committed in A, in order for it to have any effect. This is what happens in the example above, A changes the revision number stored in the repo, and bumps up the version to the latest one. The process will have to be repeated in the other main repo as well, so no automatic "use master" switch AFAIK.
B 的状态存储在 A 中(签出git submodule status
),并且必须在 A 中完成并提交修订更改,才能使其生效。这就是上面示例中发生的情况,A 更改存储在 repo 中的修订号,并将版本升级到最新版本。该过程也必须在另一个主存储库中重复,因此没有自动“使用主”开关 AFAIK。
BTW. The Git book chapter on submodulesand the submodule man pagecontain lots of useful info about submodules, as normal usage and typical pitfalls as well. Worth checking out.
顺便提一句。关于子模块的Git 书籍章节和子模块手册页包含许多关于子模块的有用信息,以及正常用法和典型陷阱。值得一试。
EDIT: I'll try to explain this better
编辑:我会尝试更好地解释这一点
I took the liberty to create example projects on my github account. The commits are meaningless and contain junk, but the setup should be fine. Please check it out to follow.
我冒昧地在我的 github 帐户上创建了示例项目。提交毫无意义并且包含垃圾,但设置应该没问题。请检查它以跟随。
Both ProjectFoo and ProjectBar share the code in the common submodule.
ProjectFoo 和 ProjectBar 共享公共子模块中的代码。
ProjectFooBarCommoneSubmodule:master is 6850e4e4c1fac49de398
ProjectFooBarCommoneSubmodule:master 是6850e4e4c1fac49de398
In ProjectFoo:
在 ProjectFoo 中:
git submodule status
-6850e4e4c1fac49de39890703f21486ca04b87a0 common
-6850e4e4c1fac49de39890703f21486ca04b87a0 普通
In ProjectBar:
在项目栏中:
git submodule status
-6850e4e4c1fac49de39890703f21486ca04b87a0 common
-6850e4e4c1fac49de39890703f21486ca04b87a0 普通
So both point to the same revision, right? The trick here is to see, that ProjectFoo and ProjectBar point to the revision(6850e4e4c1fac49de39890703f21486ca04b87a0) not the branch(master), although they are the same thing. The first one is a detached head, and the other a named branch.
所以两者都指向同一个修订版,对吧?这里的技巧是看到 ProjectFoo 和 ProjectBar 指向修订版(6850e4e4c1fac49de39890703f21486ca04b87a0)而不是分支(master),尽管它们是同一回事。第一个是分离头,另一个是命名分支。
If you want to do some fixing on ProjectFooBarCommoneSubmodule, you can go to the subdir in e.g. ProjectFoo, and choose the branch instead of the revision:
如果您想对 ProjectFooBarCommoneSubmodule 进行一些修复,您可以转到例如 ProjectFoo 中的子目录,然后选择分支而不是修订:
git checkout master
<Do your coding and pushing here>
Then go one directory up, and check git submodule status. It should tell you, that you are now out of sync. E.g
然后上一级目录,检查 git 子模块状态。它应该告诉你,你现在不同步了。例如
git submodule status
+e24bd2bf45d52171a63b67ac05cd4be0ac965f60 common (heads/master-1-ge24bd2b)
+e24bd2bf45d52171a63b67ac05cd4be0ac965f60 通用 (heads/master-1-ge24bd2b)
Now you can do a git add, to set the reference to this particular commit(ge24bd...), do a commit, and after this the submodule reference points to this revision, which also happens to be master on ProjectFooBarCommoneSubmodule.
现在你可以做一个 git add,设置对这个特定提交(ge24bd...)的引用,做一个提交,然后子模块引用指向这个修订版,它也恰好是 ProjectFooBarCommoneSubmodule 的 master。
Now you need to update the reference in ProjectBar as well. Go to ProjectBar/common, and do git fetch origin (this is a fast forward merge), do
现在您还需要更新 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
So, as with any git repository, you don't need to work on a detached head. You can either work on master, or create a named branch. Either way, make sure that upstream contains the ProjectFooBarCommoneSubmodule changes, or you will break both ProjectFoo and ProjectBar, if they reference something that doesn't exist. Hope this explained it better
因此,与任何 git 存储库一样,您不需要在分离的头上工作。您可以在 master 上工作,也可以创建一个命名分支。无论哪种方式,请确保上游包含 ProjectFooBarCommoneSubmodule 更改,否则您将破坏 ProjectFoo 和 ProjectBar,如果它们引用了不存在的内容。希望这能更好地解释它
回答by Hogdotmac
On the submodule
: git push origin HEAD:master
在submodule
:git push origin HEAD:master
回答by Anona112
If you want to commit and push all submodules at once do:
如果您想一次提交和推送所有子模块,请执行以下操作:
git submodule foreach 'git commit -a' ;
git submodule foreach 'git push --all' ;
git commit -a && \
git push --all --recurse-submodules=on-demand
回答by kenorb
To merge changed from detached HEAD into master, run:
要将已分离的 HEAD 的更改合并到 master,请运行:
git rebase HEAD master
then checkout master (use -f
for force):
然后结帐大师(-f
用于强制):
git checkout master
If you've got multiple submodules to deal with, use: git submodule foreach
, e.g.
如果您有多个子模块要处理,请使用:git submodule foreach
,例如
git submodule foreach git pull origin master -r
回答by rivanov
I just do:
我只是做:
git submodule foreach git push -u origin master
git submodule foreach git push -u origin master
回答by Fabrizio Stellato
Notice:
注意:
git submodule foreach 'git commit -a'
will fail if one of the submodules containt no commit to do.
如果其中一个子模块不包含任何提交,则将失败。
To get rid of this, you have to force the command result to 0.
要摆脱这种情况,您必须将命令结果强制为 0。
git submodule foreach "git commit -am 'your comment' || echo ' '"
By using the echo piped you force the whole command to return with 0 and continue executing the commit command on the other submodules
通过使用 echo 管道,您可以强制整个命令返回 0 并继续在其他子模块上执行提交命令