zoukankan      html  css  js  c++  java
  • 使用git submodule管理一个需要多个分立开发或者第三方repo的项目

      在项目开发中,特别是web前端开发中,有非常多的开源第三方library,我们希望引用他们,同时也希望能够方便地保持这些第三方

    开源repo的更新。另外一方面如果我们自己在开发一个网站的项目,这个项目一般分为前端和后端两个相对独立的子项目,特别是前端的repo可能在不同的项目中共享,那么这时,你就可能希望将项目分开为前端和后端两个repo,如何管理这种情况呢?一个比较好的方案就是使用git的submodule功能。

      假设我们的父repo在prepo目录,sumodule newtestrepo希望放在prepo/submods/newtestrepo这个目录,首先我们cd submods目录,

      1. 在submods目录下执行:git submodule add https://github.com/cnweibo/newtestrepo.git  这个命令将在prepo目录下创建.gitmodules文件以及在prepo/submods/目录下创建newtestrepo目录用于保存newtestrepo内容。.gitmodules文件包含以下内容:

    [submodule "submods/newtestrepo"]                                                               
            path = submods/newtestrepo                                                              
            url = https://github.com/cnweibo/newtestrepo.git  

     注意:在1.8版本git之前,上述命令必须在preop的root目录下执行!

          2.执行git status,则发现有两个变更需要commit

    (newcnweibo_branch)*$ git status                                                                
    On branch newcnweibo_branch                                                                     
    Your branch is up-to-date with 'origin/newcnweibo_branch'.                                      
                                                                                                    
    Changes to be committed:                                                                        
      (use "git reset HEAD <file>..." to unstage)                                                   
                                                                                                    
            new file:   ../.gitmodules                                                              
            new file:   newtestrepo 

    3.执行git commit将增加submodule newtestrepo这个commit做一下提交

    (newcnweibo_branch)*$  git commit -m "intro newtestrepo submodule"                              
    [newcnweibo_branch 2bb87a3] intro newtestrepo submodule                                         
     2 files changed, 4 insertions(+)                                                               
     create mode 100644 .gitmodules                                                                 
     create mode 160000 submods/newtestrepo  

    4. git push 将上述修改放到preop的中央库中去以便其他teammember使用

    5. 如何在prepo这个项目中修改submodule呢?git checkout master 进入newtestrepo的master branch, 修改文件,commit,随后git push,注意这里的push是将submodule push到中央库中。注意:submodule/newtestrepo目录下不再有.git目录,而只有一个.git文件,这一点很是奇妙!

    在我们的submodule的目录中,你查看一下.git这个文件(不是文件夹哦!)的内容实际上指示列出来一个引用gitdir指向prepo的.git/modules/xxxdir/xxxrepo

    (detached*)$ cat .git                                                                           
    gitdir: ../../.git/modules/submods/newtestrepo  

    6. 注意,这时如果我们到prepo的目录中,git status发现我们又有了两个没有commit的commit。

    随后我们需要将prepo也做push以便将上述两个commits递交.

    之所以在submodule中修改并且push后还要在prepo中push是因为我们的父repo其实是引用了子module的一个snapshot,子module修改后,父repo并没有修改对版本的引用,因此需要commit来反映这个变化。

     7.当我们另外一个teammember clone这个prepo时,注意,prepo里面所包含的submodule本身目录都为空!

    *$ pwd                                                                                                                                                                     
    /home/cabox/workspace/testgit                                                                                                                                              
    *$ git clone https://github.com/cnweibo/githubtest.git                                                                                                                     
    Cloning into 'githubtest'...                                                                                                                                               
    remote: Counting objects: 53, done.                                                                                                                                        
    remote: Total 53 (delta 0), reused 0 (delta 0), pack-reused 53                                                                                                             
    Unpacking objects: 100% (53/53), done.                                                                                                                                     
    Checking connectivity... done.                                                                                                                                             
    *$ ls                                                                                                                                                                      
    githubtest                                                                                                                                                                 
    *$ cd githubtest/                                                                                                                                                          
    (newcnweibo_branch)$ ls                                                                                                                                                    
    localconfig  newweibobranchfile  readmegithub  submods                                                                                                                     
    (newcnweibo_branch)$ git status                                                                                                                                            
    On branch newcnweibo_branch                                                                                                                                                
    Your branch is up-to-date with 'origin/newcnweibo_branch'.                                                                                                                 
                                                                                                                                                                               
    nothing to commit, working directory clean                                                                                                                                 
    (newcnweibo_branch)$ cd submods/                                                                                                                                           
    (newcnweibo_branch)$ ls                                                                                                                                                    
    newtestrepo                                                                                                                                                                
    (newcnweibo_branch)$ cd newtestrepo/                                                                                                                                       
    (newcnweibo_branch)$ ls                                                                                                                                                    
    (newcnweibo_branch)$ ls -la                                                                                                                                                
    total 8                                                                                                                                                                    
    drwxrwxr-x 2 cabox cabox 4096 May 30 01:08 .                                                                                                                               
    drwxrwxr-x 3 cabox cabox 4096 May 30 01:08 ..                                                                                                                              
    (newcnweibo_branch)$                                                                                                                                                       
                                      

    但是我们的prepo: githubtest本身却有一个文件.gitmodules,它列出了在prepo中是如何引用sub module的

    (newcnweibo_branch)$ pwd                                                                                                                                                   
    /home/cabox/workspace/testgit/githubtest                                                                                                                                                                                                                                                       
    (newcnweibo_branch)$ ls -la                                                                                                                                                
    total 32                                                                                                                                                                   
    drwxrwxr-x 4 cabox cabox 4096 May 30 01:08 .                                                                                                                               
    drwxrwxr-x 3 cabox cabox 4096 May 30 01:08 ..                                                                                                                              
    drwxrwxr-x 8 cabox cabox 4096 May 30 01:11 .git                                                                                                                            
    -rw-rw-r-- 1 cabox cabox  108 May 30 01:08 .gitmodules                                                                                                                     
    -rw-rw-r-- 1 cabox cabox 1747 May 30 01:08 localconfig                                                                                                                     
    -rw-rw-r-- 1 cabox cabox   66 May 30 01:08 newweibobranchfile                                                                                                              
    -rw-rw-r-- 1 cabox cabox  185 May 30 01:08 readmegithub                                                                                                                    
    drwxrwxr-x 3 cabox cabox 4096 May 30 01:08 submods                                                                                                                         
    (newcnweibo_branch)$ cat .gitmodules                                                                                                                                       
    [submodule "submods/newtestrepo"]                                                                                                                                          
            path = submods/newtestrepo                                                                                                                                         
            url = git@github.com:cnweibo/newtestrepo.git                                                                                                                       

    8.为了能够正常使用submodule,我们必须在新clone的prepo中执行 git submodule init命令,执行该命令时:git将通过检查.gitmodules文件中的

    [submodule "submods/newtestrepo"] 这个section,为每一个submodule都正在prepo的.git/config文件中增加一条
    [submodule "submods/newtestrepo"]                                                                                                                                          
            url = git@github.com:cnweibo/newtestrepo.git 信息!
    (newcnweibo_branch)$ pwd                                                                                                                                                   
    /home/cabox/workspace/testgit/githubtest                                                                                                                                   
    (newcnweibo_branch)$ git submodule init                                                                                                                                    
    Submodule 'submods/newtestrepo' (git@github.com:cnweibo/newtestrepo.git) registered for path 'su                                                                           
    bmods/newtestrepo'                                                                                                                                                                                                                                                                          
    (newcnweibo_branch)$ ls -la                                                                                                                                                
    total 32                                                                                                                                                                   
    drwxrwxr-x 4 cabox cabox 4096 May 30 01:08 .                                                                                                                               
    drwxrwxr-x 3 cabox cabox 4096 May 30 01:08 ..                                                                                                                              
    drwxrwxr-x 8 cabox cabox 4096 May 30 01:17 .git                                                                                                                            
    -rw-rw-r-- 1 cabox cabox  108 May 30 01:08 .gitmodules                                                                                                                     
    -rw-rw-r-- 1 cabox cabox 1747 May 30 01:08 localconfig                                                                                                                     
    -rw-rw-r-- 1 cabox cabox   66 May 30 01:08 newweibobranchfile                                                                                                              
    -rw-rw-r-- 1 cabox cabox  185 May 30 01:08 readmegithub                                                                                                                    
    drwxrwxr-x 3 cabox cabox 4096 May 30 01:08 submods                                                                                                                         
    (newcnweibo_branch)$ cat .git/                                                                                                                                             
    HEAD         config       hooks/       info/        objects/     refs/                                                                                                     
    branches/    description  index        logs/        packed-refs                                                                                                            
    (newcnweibo_branch)$ cat .git/config                                                                                                                                       
    [core]                                                                                                                                                                     
            repositoryformatversion = 0                                                                                                                                        
            filemode = true                                                                                                                                                    
            bare = false                                                                                                                                                       
            logallrefupdates = true                                                                                                                                            
    [remote "origin"]                                                                                                                                                          
            url = https://github.com/cnweibo/githubtest.git                                                                                                                    
            fetch = +refs/heads/*:refs/remotes/origin/*                                                                                                                        
    [branch "newcnweibo_branch"]                                                                                                                                               
            remote = origin                                                                                                                                                    
            merge = refs/heads/newcnweibo_branch                                                                                                                               
    [submodule "submods/newtestrepo"]                                                                                                                                          
            url = git@github.com:cnweibo/newtestrepo.git                                                                                                                       
    (newcnweibo_branch)$ 

    9.随后我们在prepo再执行git submodule update,这时git将通过Internet把所有的submodule clone进入我们的子目录中(由.gitmodules文件来决定放到哪个子目录中)

    (newcnweibo_branch)$ pwd                                                                                                                                                   
    /home/cabox/workspace/testgit/githubtest                                                                                                                                   
    (newcnweibo_branch)$ ls -la submods/newtestrepo/                                                                                                                           
    total 8                                                                                                                                                                    
    drwxrwxr-x 2 cabox cabox 4096 May 30 01:08 .                                                                                                                               
    drwxrwxr-x 3 cabox cabox 4096 May 30 01:08 ..                                                                                                                              
    (newcnweibo_branch)$ git submodule update                                                                                                                                  
    Cloning into 'submods/newtestrepo'...                                                                                                                                      
    Warning: Permanently added 'github.com,192.30.252.129' (RSA) to the list of known hosts.                                                                                   
    Permission denied (publickey).                                                                                                                                             
    fatal: Could not read from remote repository.                                                                                                                              
                                                                                                                                                                               
    Please make sure you have the correct access rights                                                                                                                        
    and the repository exists.                                                                                                                                                 
    Clone of 'git@github.com:cnweibo/newtestrepo.git' into submodule path 'submods/newtestrepo' failed                                                                                                                                                                                  
    $ ssh -T git@github.com                                                                                                                                                    
    Hi kidsit! You've successfully authenticated, but GitHub does not provide shell access.                                                                                    
    $ exit                                                                                                                                                                     
    exit                                                                                                                                                                       
    (newcnweibo_branch)*$ pwd                                                                                                                                                  
    /home/cabox/workspace/testgit/githubtest 
    (newcnweibo_branch)*$ git submodule update                                                                                                                                 
    Cloning into 'submods/newtestrepo'...                                                                                                                                      
    Warning: Permanently added the RSA host key for IP address '192.30.252.130' to the list of known hosts.                                                                    
    remote: Counting objects: 6, done.                                                                                                                                         
    remote: Compressing objects: 100% (3/3), done.                                                                                                                             
    remote: Total 6 (delta 0), reused 3 (delta 0), pack-reused 0                                                                                                               
    Receiving objects: 100% (6/6), done.                                                                                                                                       
    Checking connectivity... done.                                                                                                                                             
    Submodule path 'submods/newtestrepo': checked out '6c495d0229fcd15fd7e0bb3cded878d0692988a5'                                                                               
    (newcnweibo_branch)$ git submodule update^C                                                                                                                                
    (newcnweibo_branch)$ ls -la submods/newtestrepo/                                                                                                                           
    .git             README.md        changefromprepo                                                                                                                          
    (newcnweibo_branch)$ ls -la submods/newtestrepo/                                                                                                                           
    .git             README.md        changefromprepo                                                                                                                          
    (newcnweibo_branch)$ ls -la submods/newtestrepo/                                                                                                                           
    total 20                                                                                                                                                                   
    drwxrwxr-x 2 cabox cabox 4096 May 30 01:32 .                                                                                                                               
    drwxrwxr-x 3 cabox cabox 4096 May 30 01:32 ..                                                                                                                              
    -rw-rw-r-- 1 cabox cabox   47 May 30 01:32 .git                                                                                                                            
    -rw-rw-r-- 1 cabox cabox   14 May 30 01:32 README.md                                                                                                                       
    -rw-rw-r-- 1 cabox cabox   29 May 30 01:32 changefromprepo                                                                                                                 
    (newcnweibo_branch)$ cat submods/newtestrepo/.git                                                                                                                          
    gitdir: ../../.git/modules/submods/newtestrepo            
  • 相关阅读:
    eslint 入门项目搭建过程
    ES6 模块化笔记
    闭包
    JavaScript 内存相关知识
    Mac 配置Charles,抓取移动设备数据
    jquery.cookie的path坑
    如何模拟click事件,打开一个a标签链接?
    6月份开发问题整理
    js 淡入淡出的tab选项卡
    点击弹出模态框-以登录表单为例
  • 原文地址:https://www.cnblogs.com/kidsitcn/p/4537430.html
Copyright © 2011-2022 走看看