User Tools

Site Tools


git_submodules

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
git_submodules [2019/02/27 14:13]
rpjday [File structure of submodules]
git_submodules [2019/02/27 19:14]
rpjday [Overview]
Line 3: Line 3:
 The good and the bad of submodules, using Wind River'​s Pulsar Linux as a convenient example. The good and the bad of submodules, using Wind River'​s Pulsar Linux as a convenient example.
  
 +Stuff to add:
 +
 +  * ''​git config submodule.<​what>​.url PRIVATE_URL''​
 ===== Links ===== ===== Links =====
  
Line 241: Line 244:
 </​code>​ </​code>​
  
-===== Adding submodules (IN PROGRESS) =====+The submodule Git directories themselvesare stored under ''​.git/​modules/'':​
  
-==== Adding a submodule ​-- Part 1 ====+<​code>​ 
 +$ ls -F .git/​modules/​ 
 +bitbake/ ​             meta-intel/ ​        ​meta-virtualization/​ 
 +external-binaries/ ​   meta-iot-cloud/ ​    ​oe-core/​ 
 +fsl-ls10xx/ ​          ​meta-java/ ​         oe-meta-go/​ 
 +intel-iot-refkit/ ​    ​meta-openembedded/ ​ overc-installer/​ 
 +layers/ ​              ​meta-overc/ ​        ​qemuarm/​ 
 +meta-browser/ ​        ​meta-raspberrypi/ ​  ​qemuarma9/​ 
 +meta-cloud-services/ ​ meta-secure-core/ ​  ​vendor-proprietary/​ 
 +meta-dpdk/ ​           meta-security/ ​     wrlabs-integration/​ 
 +meta-gateway/ ​        ​meta-up-board/ ​     xilinx-zynq/​ 
 +
 +</​code>​
  
-=== Before adding ​===+<​code>​ 
 +$ ls -F .git/​modules/​bitbake/​ 
 +branches/ ​ description ​ hooks/ ​ info/  objects/ ​    ​refs/​ 
 +config ​    ​HEAD ​        ​index ​  ​logs/ ​ packed-refs 
 +
 +</​code>​ 
 + 
 +===== Checking status of submodules ​===== 
 + 
 +<​code>​ 
 +$ git submodule status 
 + ​055865047c63b9c3b213b47a1884924ce0adeda0 layers/​bitbake (1.38.0-10-g055865047) 
 + ​78d4168b29efe5e812c36502a1c300d3d4c45935 layers/​external-binaries (78d4168) 
 + ​0a8c797caa70f517c327c67b15b0d55e902b7c44 layers/​fsl-ls10xx (remotes/​origin/​pulsar-8) 
 + ​4ca2e7474b046fa0bd7813cd6da7cf455733d61c layers/​intel-iot-refkit (2017.07-258-g4ca2e74) 
 + ​1cd38d701a49eade80a04140f70d3383117b9745 layers/​meta-browser (remotes/​origin/​krogoth-266-g1cd38d7) 
 + ​31e3086409b5055b8ce5962a614f1284003c513d layers/​meta-cloud-services (31e3086) 
 + ​8a0f847836671111915088d2838e3ff6f3c7642c layers/​meta-dpdk (tmpfix-20180615) 
 + ​6975858540552012d8082c74b5c5d9db8e260865 layers/​meta-flatpak (6975858) 
 + ​48dae0603506cff9bde674755d963e5cf3e75244 layers/​meta-gateway (48dae06) 
 + ​fec5d45ec3978d4b7c9649bee45fe58f914bcee4 layers/​meta-intel (9.0-sumo-2.5-8-gfec5d45e) 
 + ​6039a7a8a9a0cad4e32736be3a05a529b65e126a layers/​meta-iot-cloud (remotes/​origin/​pulsar-x) 
 + ​aa276b00d8a6bbffffd59d1980153c99521ce6ea layers/​meta-java (tmpfix-20180615) 
 + ​a4056a96ecc857b1d675b89dc35cf9ed8a876f80 layers/​meta-openembedded (tmpfix-20180618) 
 + ​62f03f7d42f784923a8b02ce9d30d62d6552a22b layers/​meta-overc (tmpfix-20180615) 
 + ​b2da4618b0ac2ad7dbc26387cad4c03796f8a06e layers/​meta-raspberrypi (remotes/​origin/​krogoth-354-gb2da461) 
 + ​fb838242ad1b5c7caf5104cb3560dd6e655f1d92 layers/​meta-secure-core (heads/​master) 
 + ​f9c5e2022b54097474e46d9efb54080bd0e4d606 layers/​meta-security (remotes/​origin/​pulsar-8-186-gf9c5e20) 
 + ​024d0f5e404cb29789c2bba90aa72efd00f2a0e6 layers/​meta-up-board (remotes/​origin/​pulsar-x) 
 + ​8344dd9e9f55a5ea81f9c57c74bd9a8b9a04e8ad layers/​meta-virtualization (tmpfix-20180615) 
 + ​b34e86b4ee13d53f09d558e613d5b66c845edde6 layers/​oe-core (uninative-2.1-109-gb34e86b4ee) 
 + ​b29b384eae4a40933d07cc64c51e890c289d9621 layers/​oe-meta-go (heads/​ovp7-20150902) 
 + ​3998487c37639a484fde00fd66121f7660e06c56 layers/​qemuarm (remotes/​origin/​LB13_8.0_RCPL0001) 
 + ​d902f0eeec53662e30cc1ab98c5f296496d29086 layers/​qemuarma9 (remotes/​origin/​master) 
 + ​032d6a6f94297707acd228c96313a603c5702a38 layers/​vendor-proprietary (032d6a6) 
 + ​02e0f675db192294044ffbce6146ec25f34ffdba layers/​wrlabs-integration (remotes/​origin/​master-oci-fli-100-g02e0f67) 
 + ​cd816cf2bfcf0e917e02f4cbd48800ee5a583f33 layers/​xilinx-zynq (remotes/​origin/​pulsar-8) 
 + ​aabcd6ab2b69383ba4b41b7bebfc600dd3b166dd overc-installer (remotes/​origin/​pulsar-7.0-224-gaabcd6a) 
 +
 +</​code>​ 
 +===== Adding submodules ===== 
 + 
 +==== The initial repository ==== 
 + 
 +Add a submodule to the repo for the "Pro Git" book, which is clean and has no current submodules:
  
 <​code>​ <​code>​
 $ git status $ git status
 On branch master On branch master
-Your branch is up-to-date with 'origin/​master'​. +Your branch is up to date with 'rpjday/​master'​.
 nothing to commit, working tree clean nothing to commit, working tree clean
 $ $
 </​code>​ </​code>​
  
-=== Adding a submodule ===+<​code>​ 
 +$ git submodule status 
 +
 +</​code>​ 
 + 
 + 
 +==== Adding a submodule ===
  
 <​code>​ <​code>​
 $ git submodule add https://​github.com/​boostorg/​coroutine2 $ git submodule add https://​github.com/​boostorg/​coroutine2
-Cloning into '/​home/​rpjday/​ebooks/​progit/​pg2/​coroutine2'​... +Cloning into '/​home/​rpjday/​ebooks/​progit/​progit2/​coroutine2'​..
-remote: Counting objects: ​1161, done. +remote: Enumerating objects: 2, done
-remote: Compressing objects: 100% (13/13), done. +remote: Counting objects: ​100% (2/2), done. 
-remote: Total 1161 (delta ​6), reused ​16 (delta ​6), pack-reused ​1140 +remote: Compressing objects: 100% (2/2), done. 
-Receiving objects: 100% (1161/1161), 289.57 KiB | 969.00 KiB/s, done. +remote: Total 1189 (delta ​0), reused ​(delta ​0), pack-reused ​1187 
-Resolving deltas: 100% (690/690), done.+Receiving objects: 100% (1189/1189), 292.30 KiB | 1.82 MiB/s, done. 
 +Resolving deltas: 100% (703/703), done.
 $ $
 </​code>​ </​code>​
  
-=== The end result ===+Note that this has //not// committed the new submodule yet. So what //has// it done?
  
-Note the submodule is already staged, ready for commit:+==== The situation thus far ====
  
 <​code>​ <​code>​
 $ git status $ git status
 On branch master On branch master
-Your branch is up-to-date with 'origin/​master'​.+Your branch is up to date with 'rpjday/​master'​.
  
 Changes to be committed: Changes to be committed:
Line 282: Line 347:
  
  new file:   ​.gitmodules  new file:   ​.gitmodules
- new file:   ​coroutine2 ​      <-- file??+ new file:   ​coroutine2
  
 $ $
 </​code>​ </​code>​
  
-=== What's there? ===+<​code>​ 
 +$ git submodule status 
 + ​0233d35081de5b669c60ef8ec5a53854e1b2a577 coroutine2 (heads/​develop) 
 +
 +</​code>​ 
 + 
 +The new ''​.gitmodules''​ file: 
 + 
 +<​code>​ 
 +$ cat .gitmodules  
 +[submodule "​coroutine2"​] 
 + path coroutine2 
 + url https://​github.com/​boostorg/​coroutine2 
 +</​code>​ 
 + 
 +The content of the new submodule working tree:
  
 <​code>​ <​code>​
Line 300: Line 380:
 │   ├── images │   ├── images
 │   │   ├── event_model.dia │   │   ├── event_model.dia
 +│   │   ├── event_model.png
 ... etc etc ... ... etc etc ...
 </​code>​ </​code>​
  
-==== Adding a submodule -- what just happened? ==== +The content of the new submodule's Git directory:
- +
-=== The new .gitmodules file === +
- +
-The new ''​.gitmodules''​ file, which is version-controlled just like your other files so other developers can get the submodules when they clone the "​superproject"​:+
  
 <​code>​ <​code>​
-[submodule "coroutine2"] +$ ls -lF .git/​modules/​coroutine2/ 
- path = coroutine2 +total 48 
- url = https://github.com/​boostorg/​coroutine2 +drwxrwxr-x. 2 rpjday rpjday 4096 Feb 27 09:31 branches/ 
-</​code>​ +-rw-rw-r--1 rpjday rpjday ​ 297 Feb 27 09:31 config 
- +-rw-rw-r--. 1 rpjday rpjday ​  73 Feb 27 09:31 description 
-=== git diff === +-rw-rw-r--. 1 rpjday rpjday ​  24 Feb 27 09:31 HEAD 
- +drwxrwxr-x. 2 rpjday rpjday 4096 Feb 27 09:31 hooks/ 
-There is no current ''​git diff''​ since adding the submodule has already been staged+-rw-rw-r--. 1 rpjday rpjday 7299 Feb 27 09:33 index 
- +drwxrwxr-x. 2 rpjday rpjday 4096 Feb 27 09:31 info/ 
-<​code>​ +drwxrwxr-x. 3 rpjday rpjday 4096 Feb 27 09:31 logs/ 
-$ git diff+drwxrwxr-x. 4 rpjday rpjday 4096 Feb 27 09:31 objects/ 
 +-rw-rw-r--. 1 rpjday rpjday 1161 Feb 27 09:31 packed-refs 
 +drwxrwxr-x. 5 rpjday rpjday 4096 Feb 27 09:31 refs/
 $ $
 </​code>​ </​code>​
  
-but examine what's been staged:+==== Running "git diff" ====
  
 <​code>​ <​code>​
-$ git diff --staged+$ git diff --cached
 diff --git a/​.gitmodules b/​.gitmodules diff --git a/​.gitmodules b/​.gitmodules
 new file mode 100644 new file mode 100644
Line 339: Line 418:
 diff --git a/​coroutine2 b/​coroutine2 diff --git a/​coroutine2 b/​coroutine2
 new file mode 160000 new file mode 160000
-index 0000000..fc3cb67+index 0000000..0233d35
 --- /dev/null --- /dev/null
 +++ b/​coroutine2 +++ b/​coroutine2
 @@ -0,0 +1 @@ @@ -0,0 +1 @@
-+Subproject commit ​fc3cb675279708a48eb31ad2d53461b0ed4c5540++Subproject commit ​0233d35081de5b669c60ef8ec5a53854e1b2a577
 $ $
 </​code>​ </​code>​
  
-You can also use the ''​%%--%%submodule''​ option:+Abbreviated form:
  
 <​code>​ <​code>​
Line 360: Line 439:
 +       path = coroutine2 +       path = coroutine2
 +       url = https://​github.com/​boostorg/​coroutine2 +       url = https://​github.com/​boostorg/​coroutine2
-Submodule coroutine2 0000000...fc3cb67 ​(new submodule)+Submodule coroutine2 0000000...0233d35 ​(new submodule)
 $ $
 </​code>​ </​code>​
Line 367: Line 446:
  
 <​code>​ <​code>​
-$ git commit -am "added coroutine2 submodule"​ +$ git commit -a -m "added coroutine2 submodule"​ 
-[master ​bec4c94] added coroutine2 submodule+[master ​a7561cb] added coroutine2 submodule
  2 files changed, 4 insertions(+)  2 files changed, 4 insertions(+)
  ​create mode 100644 .gitmodules  ​create mode 100644 .gitmodules
- ​create mode 160000 coroutine2 ​    ​<-- weird mode for submodule+ ​create mode 160000 coroutine2 ​   <--- weird mode representing ​submodule
 $ $
 </​code>​ </​code>​
Line 379: Line 458:
 <​code>​ <​code>​
 $ git push origin master $ git push origin master
-</​code>​ 
- 
-===== Under the hood ===== 
- 
-The submodule directory has a //file// named ''​.git'',​ not a //​directory//,​ which refers to submodule information in the superproject:​ 
- 
-<​code>​ 
-$ cat coroutine2/​.git 
-gitdir: ../​.git/​modules/​coroutine2 
-$ 
-</​code>​ 
- 
-From the superproject,​ you can see the information for each submodule: 
- 
-<​code>​ 
-$ ls -l .git/​modules/​coroutine2/​ 
-total 48 
-drwxrwxr-x. 2 rpjday rpjday 4096 Feb 13 15:37 branches 
--rw-rw-r--. 1 rpjday rpjday ​ 297 Feb 13 15:37 config 
--rw-rw-r--. 1 rpjday rpjday ​  73 Feb 13 15:37 description 
--rw-rw-r--. 1 rpjday rpjday ​  24 Feb 13 15:37 HEAD 
-drwxrwxr-x. 2 rpjday rpjday 4096 Feb 13 15:37 hooks 
--rw-rw-r--. 1 rpjday rpjday 7299 Feb 13 15:38 index 
-drwxrwxr-x. 2 rpjday rpjday 4096 Feb 13 15:37 info 
-drwxrwxr-x. 3 rpjday rpjday 4096 Feb 13 15:37 logs 
-drwxrwxr-x. 4 rpjday rpjday 4096 Feb 13 15:37 objects 
--rw-rw-r--. 1 rpjday rpjday 1174 Feb 13 15:37 packed-refs 
-drwxrwxr-x. 5 rpjday rpjday 4096 Feb 13 15:37 refs 
-$ 
-</​code>​ 
- 
-===== Cloning a project with submodules ===== 
- 
-If you don't want to populate the submodule directories:​ 
- 
-<​code>​ 
-$ git clone https://​github.com/​boostorg/​boost 
-</​code>​ 
- 
-If you want to populate the submodule diredctories:​ 
- 
-<​code>​ 
-$ git clone --recurse-submodules https://​github.com/​boostorg/​boost 
-</​code>​ 
- 
-Populate all submodules after the fact: 
- 
-<​code>​ 
-$ git submodule update --init --recursive 
 </​code>​ </​code>​
  
  
git_submodules.txt · Last modified: 2019/02/27 19:14 by rpjday