Manuel Koller <koller.manuel@xxxxxxxxx> writes: > In have wrote a workaround for the problem i posted that goes into this > direction. I just check whether the url has changed and remove the > submodule by hand if it did. ... which might be wrong, depending on how you implement it, so be careful (see below). > ... > What is the purpose of having two different submodules in the same path? > Identifying the submodule by url however would probably make things > considerably faster... There are three primary things involved when talking about a submodule in a superproject. Its name, its path in the superproject hierarchy, and its URL (if it is foreign). The canonical example used when discussing the design of Git submodule support is to imagine your superproject that is about a small router that has a kernel component as a submodule that lives in kernel/ hierarchy (your userland may live elsewhere in the tree, either as a submodule bound at src/ hierarchy or contained in the superproject itself and it does not make a difference). You may had two major versions of your product. v1.0 line used to use BSD kernels, and v2.0 line with linux-2.6 kernels. Even though a checkout of any version of your superproject has a submodule bound at its kernel/ directory, the logical identity of the submodule used in your v1.0 line of product and v2.0 line are different. You can differenciate them by giving them different names, say 'kernel' and 'linux-kernel' [*1*]. When you checkout the v1.0 tag, kernel/ directory should be populated by the submodule that house the BSD kernel. When you checkout the v2.0 tag, it should house the Linux 2.6 kernel. Now, your v3.0 line will still use linux-2.6 (and now linux-3.0) kernel. Logically, the kernel project is the same thing. linux-3.0 is just a continuation of linux-2.6 series and maintained in the *logically* same upstream repository. However, the repository location has recently changed and now lives in http://www.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git even though it used to be linux-2.6.git in the same hierarchy [*2*]. The name of the submodule ('linux-kernel') does not have to change, as the repository in the new location has all the history for linux-2.6 kernel as well. The URL mapping recorded in .gitmodules in-tree from the submodule name to the location however needs to change [*3*]. Ideally (I do not think the current "git submodule" implementation does this), there should be a more automated way to optionally allow switching the upstream URL of the 'linux-kernel' subproject bound at kernel/ directory when you switch between commits in the v2.0 series and in the v3.0 series of the superproject [*3*], so that the user can say "Yes, I know linux.git URL contains everything needed from linux-2.6.git URL, so just update the submodule's upstream URL to linux.git one, and keep it like so; there is no need to use the older URL even when I check out v2.0 from the superproject" or "Notice when the URL recorded in .gitmodules for this project changes when I check out a different version of the superproject, and use the old URL to update the submodule when I check out the old version of the superproject". Even though it is an ancient design discussion, this thread is worth a read before discussing anything about submodules: http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47498 not because the ideas that were discussed but not implemented in the current "git submodule" are all good things that should be added, but because the discussion shows what kind of considerations need to go into the design. [Footnotes] *1* In the ideal world, you would have called it 'bsd' back in your v1.0 days with a foresight that someday you would switch to 'linux', but it is likely you would not have been perfect. *2* You can still access it as linux-2.6.git because k.org is trying to be nice to its users, but that is besides the point. *3* It becomes relevant if you imagine a case where the old linux-2.6.git repository at k.org were left frozen at the last version of the 2.6 series and the new history is only available in linux.git repository. -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html