IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    一个git submodule update引发的问题

    流动发表于 2019-09-06 15:13:51
    love 0

    背景

    1月份的时候,用hugo搭了这套博客系统。

    本机写md文件,更新到github,然后通过travis-ci自动发布。

    jane主题是通过git submodule引入的,.gitmodules文件内容。

    [submodule "themes/jane"]
    	path = themes/jane
    	url = https://github.com/xianmin/hugo-theme-jane.git
    

    问题

    最近几天更新完文章后,发现首页显示出了问题。

    一开始以为是主题有问题,具体描述见首页文章不显示了。

    在issue里: shaform提到使用的并不是最新的版本。 RocFang提到是git submodule使用的问题。

    但是travis-ci每次都是通过git submodule update --init --recursive更新子仓库代码的,为什么会不是最新的代码呢。

    问题重现

    接下来,我们用一个新的仓库,来模拟重现一下。

    1. 克隆仓库。

      [root@VM_81_18_centos xx]# git clone git@github.com:Liudon/test.git
      Cloning into 'test'...
      [root@VM_81_18_centos test]# 
      
    2. 添加文件。

       [root@VM_81_18_centos xx]# cd test/
       [root@VM_81_18_centos test]# echo "# test" >> README.md
       [root@VM_81_18_centos test]# git add README.md
       [root@VM_81_18_centos test]# 
      
    3. 引用子仓库。

       [root@VM_81_18_centos test]# git submodule add git@github.com:xianmin/hugo-theme-jane.git theme/jane
       Cloning into 'theme/jane'...
       remote: Enumerating objects: 216, done.
       remote: Counting objects: 100% (216/216), done.
       remote: Compressing objects: 100% (128/128), done.
       remote: Total 6165 (delta 102), reused 159 (delta 65), pack-reused 5949
       Receiving objects: 100% (6165/6165), 3.05 MiB | 1.70 MiB/s, done.
       Resolving deltas: 100% (3443/3443), done.
      
    4. 查看文件列表。

       [root@VM_81_18_centos test]# ll
       total 8
       -rw-r--r-- 1 root root    5 Sep  6 16:05 README.md
       drwxr-xr-x 7 root root 4096 Sep  6 16:08 typecho
       [root@VM_81_18_centos test]# 
      
    5. 查看状态。

      [root@VM_81_18_centos test]# git status
      # On branch master
      #
      # Initial commit
      #
      # Changes to be committed:
      #   (use "git rm --cached <file>..." to unstage)
      #
      #	new file:   .gitmodules
      #	new file:   README.md
      #	new file:   typecho
      #
      [root@VM_81_18_centos test]# 
      
    6. 查看修改。

      [root@VM_81_18_centos test]# git diff --cached
      diff --git a/.gitmodules b/.gitmodules
      new file mode 100644
      index 0000000..b1ddf70
      --- /dev/null
      +++ b/.gitmodules
      @@ -0,0 +1,3 @@
      +[submodule "typecho"]
      +       path = typecho
      +       url = https://github.com/Liudon/typecho
      diff --git a/README.md b/README.md
      new file mode 100644
      index 0000000..9daeafb
      --- /dev/null
      +++ b/README.md
      @@ -0,0 +1 @@
      +test
      diff --git a/typecho b/typecho
      new file mode 160000
      index 0000000..b0c4cc7
      --- /dev/null
      +++ b/typecho
      @@ -0,0 +1 @@
      +Subproject commit b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1
      [root@VM_81_18_centos test]# 
      

      注意最后一行Subproject commit b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1。

      这个commitId是子仓库最新提交的记录id,对应的修改记录。

    7. 提交修改。

      [root@VM_81_18_centos test]# git push -u origin master
      Counting objects: 4, done.
      Compressing objects: 100% (3/3), done.
      Writing objects: 100% (4/4), 362 bytes | 0 bytes/s, done.
      Total 4 (delta 0), reused 0 (delta 0)
      To git@github.com:Liudon/test.git
      * [new branch]      master -> master
      Branch master set up to track remote branch master from origin.
      [root@VM_81_18_centos test]# 
      

      提交后,在github上子仓库后面会多显示一个@xxxxx,这里就是引用的commitId,对应到前面git diff最后一行。

      点击查看提交记录。

      本次提交的commitId为5b11d515db8ad8d299ef1691f115590e0015c3b7,子仓库typecho单独记录了引入时的commitId,为b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1,对应的提交记录。

    8. 接下来克隆子仓库,进行更新提交。

      [root@VM_81_18_centos xx]# git clone git@github.com:Liudon/typecho.git
      Cloning into 'typecho'...
      remote: Enumerating objects: 1, done.
      remote: Counting objects: 100% (1/1), done.
      remote: Total 7179 (delta 0), reused 0 (delta 0), pack-reused 7178
      Receiving objects: 100% (7179/7179), 7.26 MiB | 2.02 MiB/s, done.
      Resolving deltas: 100% (4844/4844), done.
      [root@VM_81_18_centos xx]# 
      [root@VM_81_18_centos xx]# cd typecho/
      [root@VM_81_18_centos typecho]# git log -n 1
      commit b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1
      Merge: c904005 8fd7492
      Author: 祁宁 <magike.net@gmail.com>
      Date:   Tue Nov 18 13:59:52 2014 +0800
      
          Merge branch 'master' of https://github.com/typecho/typecho
      [root@VM_81_18_centos typecho]#
      

      通过git log,确认最新的提交commitId为b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1,与前面的引入的一致。

      [root@VM_81_18_centos typecho]# echo "xxx" > test
      [root@VM_81_18_centos typecho]# 
      [root@VM_81_18_centos typecho]# git add test
      [root@VM_81_18_centos typecho]# git commit -m 'test'
      [master 5dcc8f4] test
      1 file changed, 1 insertion(+)
      create mode 100644 test
      [root@VM_81_18_centos typecho]# git push
      Counting objects: 4, done.
      Compressing objects: 100% (2/2), done.
      Writing objects: 100% (3/3), 252 bytes | 0 bytes/s, done.
      Total 3 (delta 1), reused 0 (delta 0)
      remote: Resolving deltas: 100% (1/1), completed with 1 local object.
      To git@github.com:Liudon/typecho.git
      b0c4cc7..5dcc8f4  master -> master
      [root@VM_81_18_centos typecho]# 
      

      修改文件提交。

      [root@VM_81_18_centos typecho]# git log -n 1
      commit 5dcc8f4e91cc724ba82aba5b9e7955727b58c5c2
      Author: liudon <i.mu@qq.com>
      Date:   Fri Sep 6 16:26:47 2019 +0800
      
          test
      [root@VM_81_18_centos typecho]#
      

      最新提交的commitId为5dcc8f4e91cc724ba82aba5b9e7955727b58c5c2。

    9. 重新克隆test库。

      [root@VM_81_18_centos yy]# git clone git@github.com:Liudon/test.git
      Cloning into 'test'...
      remote: Enumerating objects: 4, done.
      remote: Counting objects: 100% (4/4), done.
      remote: Compressing objects: 100% (3/3), done.
      remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0
      Receiving objects: 100% (4/4), done.
      [root@VM_81_18_centos yy]# cd test/
      [root@VM_81_18_centos test]# ll
      total 8
      -rw-r--r-- 1 root root    5 Sep  6 16:31 README.md
      drwxr-xr-x 2 root root 4096 Sep  6 16:31 typecho
      [root@VM_81_18_centos test]# ll typecho/
      total 0
      [root@VM_81_18_centos test]# 
      

      这里可以看到typecho目录下是没有文件的。

      [root@VM_81_18_centos test]# git submodule update --init --recursive
      Submodule 'typecho' (https://github.com/Liudon/typecho) registered for path 'typecho'
      Cloning into 'typecho'...
      remote: Enumerating objects: 4, done.
      remote: Counting objects: 100% (4/4), done.
      remote: Compressing objects: 100% (3/3), done.
      remote: Total 7182 (delta 0), reused 2 (delta 0), pack-reused 7178
      Receiving objects: 100% (7182/7182), 7.26 MiB | 1.26 MiB/s, done.
      Resolving deltas: 100% (4844/4844), done.
      Submodule path 'typecho': checked out 'b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1'
      [root@VM_81_18_centos test]#
      

      更新子仓库代码,这里可以看到最终checkout的版本为b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1,与前面提交时的版本一致。

    问题分析

    git submodule add的时候,会记录当时引入时子仓库的版本id。

    git submodule update --init --recursive,会检出引入时的仓库版本,这就是为啥代码没有更新了。

    问题解决

    [root@VM_81_18_centos yy]# git clone git@github.com:Liudon/test.git
    Cloning into 'test'...
    remote: Enumerating objects: 4, done.
    remote: Counting objects: 100% (4/4), done.
    remote: Compressing objects: 100% (3/3), done.
    remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0
    Receiving objects: 100% (4/4), done.
    [root@VM_81_18_centos yy]# 
    [root@VM_81_18_centos yy]# 
    [root@VM_81_18_centos yy]# cd test/
    [root@VM_81_18_centos test]# ll
    total 8
    -rw-r--r-- 1 root root    5 Sep  6 16:37 README.md
    drwxr-xr-x 2 root root 4096 Sep  6 16:37 typecho
    [root@VM_81_18_centos test]# ll typecho/
    total 0
    [root@VM_81_18_centos test]# 
    [root@VM_81_18_centos test]# git submodule update --init --remote --recursive
    Submodule 'typecho' (https://github.com/Liudon/typecho) registered for path 'typecho'
    Cloning into 'typecho'...
    remote: Enumerating objects: 4, done.
    remote: Counting objects: 100% (4/4), done.
    remote: Compressing objects: 100% (3/3), done.
    remote: Total 7182 (delta 0), reused 2 (delta 0), pack-reused 7178
    Receiving objects: 100% (7182/7182), 7.26 MiB | 1.24 MiB/s, done.
    Resolving deltas: 100% (4844/4844), done.
    Submodule path 'typecho': checked out '5dcc8f4e91cc724ba82aba5b9e7955727b58c5c2'
    [root@VM_81_18_centos test]#
    

    使用git submodule update --init --remote --recursive命令。



沪ICP备19023445号-2号
友情链接