中文字幕人妻中文_99精品欧美一区二区三区综合在线_精品久久久久一区二区_色月丁香_免费福利在线视频_欧美大片免费观看网址_国产伦精品一区二区三区在线播放_污污污污污污www网站免费_久久月本道色综合久久_色69激情爱久久_尹人香蕉久久99天天拍_国产美女www_亚洲国产精品无码7777一线_五月婷婷六月激情_看免费一级片_精品久久久久久成人av_在线色亚洲_女人另类性混交zo_国产精品青青在线观看爽香蕉_人人澡人人添人人爽一区二区

主頁 > 知識(shí)庫 > Git Submodule使用完整教程(小結(jié))

Git Submodule使用完整教程(小結(jié))

熱門標(biāo)簽:400電話申請(qǐng)到底哪家好 外呼系統(tǒng)怎么群發(fā)短信 聯(lián)通外呼系統(tǒng)電腦app軟件 400電話辦理費(fèi)用低 鶴壁高頻外呼系統(tǒng)多少錢一個(gè)月 地圖標(biāo)注項(xiàng)目幾個(gè)月 宿遷怎么辦理400電話 蘇州呼叫中心外呼系統(tǒng)哪家強(qiáng) 谷歌地圖標(biāo)注日期

自從看了蔣鑫的《Git權(quán)威指南》之后就開始使用Git Submodule功能,團(tuán)隊(duì)也都熟悉了怎么使用,多個(gè)子系統(tǒng)(模塊)都能及時(shí)更新到最新的公共資源,把使用的過程以及經(jīng)驗(yàn)和容易遇到的問題分享給大家。

Git Submodule功能剛剛開始學(xué)習(xí)可能覺得有點(diǎn)怪異,所以本教程把每一步的操作的命令和結(jié)果都用代碼的形式展現(xiàn)給大家,以便更好的理解。

1.對(duì)于公共資源各種程序員的處理方式

每個(gè)公司的系統(tǒng)都會(huì)有一套統(tǒng)一的系統(tǒng)風(fēng)格,或者針對(duì)某一個(gè)大客戶的多個(gè)系統(tǒng)風(fēng)格保持統(tǒng)一,而且如果風(fēng)格改動(dòng)后要同步到多個(gè)系統(tǒng)中;這樣的需求幾乎每個(gè)開發(fā)人員都遇到,下面看看各個(gè)層次的程序員怎么處理:

假如對(duì)于系統(tǒng)的風(fēng)格需要幾個(gè)目錄:css、images、js。

  • 普通程序員,把最新版本的代碼逐個(gè)復(fù)制到每個(gè)項(xiàng)目中,如果有N個(gè)項(xiàng)目,那就是要復(fù)制N x 3次;如果漏掉了某個(gè)文件夾沒有復(fù)制…@(#@#。
  • 文藝程序員,使用Git Submodule功能,執(zhí)行:git submodule update,然后沖一杯咖啡悠哉的享受著。

引用一段《Git權(quán)威指南》的話: 項(xiàng)目的版本庫在某些情況蝦需要引用其他版本庫中的文件,例如公司積累了一套常用的函數(shù)庫,被多個(gè)項(xiàng)目調(diào)用,顯然這個(gè)函數(shù)庫的代碼不能直接放到某個(gè)項(xiàng)目的代碼中,而是要獨(dú)立為一個(gè)代碼庫,那么其他項(xiàng)目要調(diào)用公共函數(shù)庫該如何處理呢?分別把公共函數(shù)庫的文件拷貝到各自的項(xiàng)目中會(huì)造成冗余,丟棄了公共函數(shù)庫的維護(hù)歷史,這顯然不是好的方法。

2.開始學(xué)習(xí)Git Submodule

“工欲善其事,必先利其器”!

既然文藝程序員那么輕松就搞定了,那我們就把過程一一道來。

說明:本例采用兩個(gè)項(xiàng)目以及兩個(gè)公共類庫演示對(duì)submodule的操作。因?yàn)樵谝粚戀Y料或者書上的例子都是一個(gè)項(xiàng)目對(duì)應(yīng)1~N個(gè)lib,但是實(shí)際應(yīng)用往往并不是這么簡(jiǎn)單。

2.1 創(chuàng)建Git Submodule測(cè)試項(xiàng)目

2.1.1 準(zhǔn)備環(huán)境

➜ henryyan@hy-hp ~ pwd
/home/henryyan
mkdir -p submd/repos

創(chuàng)建需要的本地倉(cāng)庫:

cd ~/submd/repos
git --git-dir=lib1.git init --bare
git --git-dir=lib2.git init --bare
git --git-dir=project1.git init --bare
git --git-dir=project2.git init --bare

初始化工作區(qū):

mkdir ~/submd/ws
cd ~/submd/ws

2.1.2 初始化項(xiàng)目

初始化project1:

➜ henryyan@hy-hp ~/submd/ws git clone ../repos/project1.git 
Cloning into project1...
done.
warning: You appear to have cloned an empty repository.
 
➜ henryyan@hy-hp ~/submd/ws cd project1
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) echo "project1" > project-infos.txt
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ ls
project-infos.txt
 
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git add project-infos.txt 
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached file>..." to unstage)
#
# new file: project-infos.txt
#
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git commit -m "init project1"
[master (root-commit) 473a2e2] init project1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 project-infos.txt
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 232 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/henryyan/submd/ws/../repos/project1.git
 * [new branch]  master -> master
/file>

初始化project2:

➜ henryyan@hy-hp ~/submd/ws/project1 cd ..
➜ henryyan@hy-hp ~/submd/ws git clone ../repos/project2.git 
Cloning into project2...
done.
warning: You appear to have cloned an empty repository.
 
➜ henryyan@hy-hp ~/submd/ws cd project2
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) echo "project2" > project-infos.txt
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ ls
project-infos.txt
 
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git add project-infos.txt 
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached file>..." to unstage)
#
# new file: project-infos.txt
#
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git commit -m "init project2"
[master (root-commit) 473a2e2] init project2
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 project-infos.txt
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 232 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/henryyan/submd/ws/../repos/project2.git
 * [new branch]  master -> master
/file>

2.1.3 初始化公共類庫

初始化公共類庫lib1:

➜ henryyan@hy-hp ~/submd/ws git clone ../repos/lib1.git 
Cloning into lib1...
done.
warning: You appear to have cloned an empty repository.
➜ henryyan@hy-hp ~/submd/ws cd lib1 
➜ henryyan@hy-hp ~/submd/ws/lib1 git:(master) echo "I'm lib1." > lib1-features
➜ henryyan@hy-hp ~/submd/ws/lib1 git:(master) ✗ git add lib1-features 
➜ henryyan@hy-hp ~/submd/ws/lib1 git:(master) ✗ git commit -m "init lib1"
[master (root-commit) c22aff8] init lib1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 lib1-features
➜ henryyan@hy-hp ~/submd/ws/lib1 git:(master) git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 227 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/henryyan/submd/ws/../repos/lib1.git
 * [new branch]  master -> master

初始化公共類庫lib2:

➜ henryyan@hy-hp ~/submd/ws/lib1 git:(master) cd ..
➜ henryyan@hy-hp ~/submd/ws git clone ../repos/lib2.git 
Cloning into lib2...
done.
warning: You appear to have cloned an empty repository.
➜ henryyan@hy-hp ~/submd/ws cd lib2 
➜ henryyan@hy-hp ~/submd/ws/lib2 git:(master) echo "I'm lib2." > lib2-features
➜ henryyan@hy-hp ~/submd/ws/lib2 git:(master) ✗ git add lib2-features 
➜ henryyan@hy-hp ~/submd/ws/lib2 git:(master) ✗ git commit -m "init lib2"
[master (root-commit) c22aff8] init lib2
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 lib2-features
➜ henryyan@hy-hp ~/submd/ws/lib2 git:(master) git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 227 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/henryyan/submd/ws/../repos/lib2.git
 * [new branch]  master -> master

2.2 為主項(xiàng)目添加Submodules

2.2.1 為project1添加lib1和lib2

➜ henryyan@hy-hp ~/submd/ws/lib2 git:(master) cd ../project1
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ls
project-infos.txt
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) git submodule add ~/submd/repos/lib1.git libs/lib1
Cloning into libs/lib1...
done.
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git submodule add ~/submd/repos/lib2.git libs/lib2
Cloning into libs/lib2...
done.
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ ls
libs project-infos.txt
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ ls libs 
lib1 lib2
 
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git status 
# On branch master
# Changes to be committed:
# (use "git reset HEAD file>..." to unstage)
#
# new file: .gitmodules
# new file: libs/lib1
# new file: libs/lib2
#
 
# 查看一下公共類庫的內(nèi)容
 
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) cat libs/lib1/lib1-features
I'm lib1.
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) cat libs/lib2/lib2-features
I'm lib2.
/file>

好了,到目前為止我們已經(jīng)使用git submodule add命令為project1成功添加了兩個(gè)公共類庫(lib1、lib2),查看了當(dāng)前的狀態(tài)發(fā)現(xiàn)添加了一個(gè)新文件(.gitmodules)和兩個(gè)文件夾(libs/lib1、libs/lib2);那么新增的.gitmodules文件是做什么用的呢?我們查看一下文件內(nèi)容便知曉了:

n@hy-hp ~/submd/ws/project1 git:(master) ✗ cat .gitmodules 
[submodule "libs/lib1"]
 path = libs/lib1
 url = /home/henryyan/submd/repos/lib1.git
[submodule "libs/lib2"]
 path = libs/lib2
 url = /home/henryyan/submd/repos/lib2.git

原來如此,.gitmodules記錄了每個(gè)submodule的引用信息,知道在當(dāng)前項(xiàng)目的位置以及倉(cāng)庫的所在。

好的,我們現(xiàn)在把更改提交到倉(cāng)庫。

➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git commit -a -m "add submodules[lib1,lib2] to project1"
[master 7157977] add submodules[lib1,lib2] to project1
 3 files changed, 8 insertions(+), 0 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 libs/lib1
 create mode 160000 libs/lib2
 
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) git push
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 491 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
To /home/henryyan/submd/ws/../repos/project1.git
 45cbbcb..7157977 master -> master

假如你是第一次引入公共類庫的開發(fā)人員,那么項(xiàng)目組的其他成員怎么Clone帶有Submodule的項(xiàng)目呢,下面我們?cè)賑lone一個(gè)項(xiàng)目講解如何操作。

2.3 Clone帶有Submodule的倉(cāng)庫

模擬開發(fā)人員B……

➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) cd ~/submd/ws
➜ henryyan@hy-hp ~/submd/ws git clone ../repos/project1.git project1-b
Cloning into project1-b...
done.
➜ henryyan@hy-hp ~/submd/ws cd project1-b 
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) git submodule 
-c22aff85be91eca442734dcb07115ffe526b13a1 libs/lib1
-7290dce0062bd77df1d83b27dd3fa3f25a836b54 libs/lib2

看到submodules的狀態(tài)是hash碼和文件目錄,但是注意前面有一個(gè)減號(hào):-,含義是該子模塊還沒有檢出。

OK,檢出project1-b的submodules……

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) git submodule init
Submodule 'libs/lib1' (/home/henryyan/submd/repos/lib1.git) registered for path 'libs/lib1'
Submodule 'libs/lib2' (/home/henryyan/submd/repos/lib2.git) registered for path 'libs/lib2'
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) git submodule update
Cloning into libs/lib1...
done.
Submodule path 'libs/lib1': checked out 'c22aff85be91eca442734dcb07115ffe526b13a1'
Cloning into libs/lib2...
done.
Submodule path 'libs/lib2': checked out '7290dce0062bd77df1d83b27dd3fa3f25a836b54'

讀者可以查看:.git/config文件的內(nèi)容,最下面有submodule的注冊(cè)信息!

驗(yàn)證一下類庫的文件是否存在:

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) cat libs/lib1/lib1-features libs/lib2/lib2-features
I'm lib1.
I'm lib2.

上面的兩個(gè)命令(git submodule init update)其實(shí)可以簡(jiǎn)化,后面會(huì)講到!

2.3 修改Submodule

我們?cè)陂_發(fā)人員B的項(xiàng)目上修改Submodule的內(nèi)容。

先看一下當(dāng)前Submodule的狀態(tài):

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) cd libs/lib1
➜ henryyan@hy-hp ~/submd/ws/project1-b/libs/lib1 git status
# Not currently on any branch.
nothing to commit (working directory clean)

為什么是Not currently on any branch呢?不是應(yīng)該默認(rèn)在master分支嗎?別急,一一解答!

Git對(duì)于Submodule有特殊的處理方式,在一個(gè)主項(xiàng)目中引入了Submodule其實(shí)Git做了3件事情:

  • 記錄引用的倉(cāng)庫
  • 記錄主項(xiàng)目中Submodules的目錄位置
  • 記錄引用Submodule的commit id

在project1中push之后其實(shí)就是更新了引用的commit id,然后project1-b在clone的時(shí)候獲取到了submodule的commit id,然后當(dāng)執(zhí)行g(shù)it submodule update的時(shí)候git就根據(jù)gitlink獲取submodule的commit id,最后獲取submodule的文件,所以clone之后不在任何分支上;但是master分支的commit id和HEAD保持一致。

查看~/submd/ws/project1-b/libs/lib1的引用信息:

➜ henryyan@hy-hp ~/submd/ws/project1-b/libs/lib1 cat .git/HEAD
c22aff85be91eca442734dcb07115ffe526b13a1
➜ henryyan@hy-hp ~/submd/ws/project1-b/libs/lib1 cat .git/refs/heads/master    
c22aff85be91eca442734dcb07115ffe526b13a1

現(xiàn)在我們要修改lib1的文件需要先切換到master分支:

➜ henryyan@hy-hp ~/submd/ws/project1-b/libs/lib1 git checkout master
Switched to branch 'master'
➜ henryyan@hy-hp ~/submd/ws/project1-b/libs/lib1 git:(master) echo "add by developer B" >> lib1-features
➜ henryyan@hy-hp ~/submd/ws/project1-b/libs/lib1 git:(master) ✗ git commit -a -m "update lib1-features by developer B"
[master 36ad12d] update lib1-features by developer B
 1 files changed, 1 insertions(+), 0 deletions(-)

在主項(xiàng)目中修改Submodule提交到倉(cāng)庫稍微繁瑣一點(diǎn),在git push之前我們先看看project1-b狀態(tài):

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git status
# On branch master
# Changes not staged for commit:
# (use "git add file>..." to update what will be committed)
# (use "git checkout -- file>..." to discard changes in working directory)
#
# modified: libs/lib1 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
/file>/file>

libs/lib1 (new commits)狀態(tài)表示libs/lib1有新的提交,這個(gè)比較特殊,看看project1-b的狀態(tài):

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git diff
diff --git a/libs/lib1 b/libs/lib1
index c22aff8..36ad12d 160000
--- a/libs/lib1
+++ b/libs/lib1
@@ -1 +1 @@
-Subproject commit c22aff85be91eca442734dcb07115ffe526b13a1
+Subproject commit 36ad12d40d8a41a4a88a64add27bd57cf56c9de2

從狀態(tài)中可以看出libs/lib1的commit id由原來的c22aff85be91eca442734dcb07115ffe526b13a1更改為36ad12d40d8a41a4a88a64add27bd57cf56c9de2

注意:如果現(xiàn)在執(zhí)行了git submodule update操作那么libs/lib1的commit id又會(huì)還原到c22aff85be91eca442734dcb07115ffe526b13a1,

這樣的話剛剛的修改是不是就丟死了呢?不會(huì),因?yàn)樾薷囊呀?jīng)提交到了master分支,只要再git checkout master就可以了。
現(xiàn)在可以把libs/lib1的修改提交到倉(cāng)庫了:

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ cd libs/lib1
➜ henryyan@hy-hp ~/submd/ws/project1-b/libs/lib1 git:(master) git push
Counting objects: 5, done.
Writing objects: 100% (3/3), 300 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/henryyan/submd/repos/lib1.git
 c22aff8..36ad12d master -> master

現(xiàn)在僅僅只完成了一步,下一步要提交project1-b引用submodule的commit id:

➜ henryyan@hy-hp ~/submd/ws/project1-b/libs/lib1 git:(master) cd ~/submd/ws/project1-b
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git add -u
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git commit -m "update libs/lib1 to lastest commit id"
[master c96838a] update libs/lib1 to lastest commit id
 1 files changed, 1 insertions(+), 1 deletions(-)
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) git push
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 395 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/henryyan/submd/ws/../repos/project1.git
 7157977..c96838a master -> master

OK,大功高成,我們完成了Submodule的修改并把libs/lib1的最新commit id提交到了倉(cāng)庫。

接下來要看看project1怎么獲取submodule了。

2.4 更新主項(xiàng)目的Submodules

好的,讓我們先進(jìn)入project1目錄同步倉(cāng)庫:

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) cd ../project1
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) git pull
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/henryyan/submd/ws/../repos/project1
 7157977..c96838a master  -> origin/master
Updating 7157977..c96838a
Fast-forward
 libs/lib1 | 2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git status
# On branch master
# Changes not staged for commit:
# (use "git add file>..." to update what will be committed)
# (use "git checkout -- file>..." to discard changes in working directory)
#
# modified: libs/lib1 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
/file>/file>

我們運(yùn)行了git pull命令和git status獲取了最新的倉(cāng)庫源碼,然后看到了狀態(tài)時(shí)modified,這是為什么呢?

我們用git diff比較一下不同:

➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git diff
diff --git a/libs/lib1 b/libs/lib1
index 36ad12d..c22aff8 160000
--- a/libs/lib1
+++ b/libs/lib1
@@ -1 +1 @@
-Subproject commit 36ad12d40d8a41a4a88a64add27bd57cf56c9de2
+Subproject commit c22aff85be91eca442734dcb07115ffe526b13a1
從diff的結(jié)果分析出來時(shí)因?yàn)閟ubmodule的commit id更改了,我們前面剛剛講了要在主項(xiàng)目更新submodule的內(nèi)容首先要提交submdoule的內(nèi)容,然后再更新主項(xiàng)目中引用的submodulecommit id;現(xiàn)在我們看到的不同就是因?yàn)閯倓偢牧藀roject1-b的submodule commit id;好的,我來學(xué)習(xí)一下怎么更新project1的公共類庫。

follow me……
 
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git submodule update
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git status
# On branch master
# Changes not staged for commit:
# (use "git add file>..." to update what will be committed)
# (use "git checkout -- file>..." to discard changes in working directory)
#
# modified: libs/lib1 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
/file>/file>

泥馬,為什么沒有更新?git submodule update命令不是更新子模塊倉(cāng)庫的嗎?

別急,先聽我解釋;因?yàn)樽幽K是在project1中引入的,git submodule add ~/submd/repos/lib1.git libs/lib1命令的結(jié)果,操作之后git只是把lib1的內(nèi)容clone到了project1中,但是沒有在倉(cāng)庫注冊(cè),證據(jù)如下:

➜ henryyan@hy-hp ~/submd2/ws/project1 git:(master) ✗ cat .git/config
[core]
 repositoryformatversion = 0
 filemode = true
 bare = false
 logallrefupdates = true
[remote "origin"]
 fetch = +refs/heads/*:refs/remotes/origin/*
 url = /home/henryyan/submd/ws/../repos/project1.git
[branch "master"]
 remote = origin
 merge = refs/heads/master

我們說過git submodule init就是在.git/config中注冊(cè)子模塊的信息,下面我們?cè)囋囎?cè)之后再更新子模塊:

➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git submodule init
Submodule 'libs/lib1' (/home/henryyan/submd/repos/lib1.git) registered for path 'libs/lib1'
Submodule 'libs/lib2' (/home/henryyan/submd/repos/lib2.git) registered for path 'libs/lib2'
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git submodule update
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/henryyan/submd/repos/lib1
 c22aff8..36ad12d master  -> origin/master
Submodule path 'libs/lib1': checked out '36ad12d40d8a41a4a88a64add27bd57cf56c9de2'
 
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) cat .git/config
[core]
 repositoryformatversion = 0
 filemode = true
 bare = false
 logallrefupdates = true
[remote "origin"]
 fetch = +refs/heads/*:refs/remotes/origin/*
 url = /home/henryyan/submd/ws/../repos/project1.git
[branch "master"]
 remote = origin
 merge = refs/heads/master
[submodule "libs/lib1"]
 url = /home/henryyan/submd/repos/lib1.git
[submodule "libs/lib2"]
 url = /home/henryyan/submd/repos/lib2.git
 
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) cat libs/lib1/lib1-features
I'm lib1.
add by developer B

上面的結(jié)果足以證明剛剛的推斷,所以記得當(dāng)需要更新子模塊的內(nèi)容時(shí)請(qǐng)先確保已經(jīng)運(yùn)行過git submodule init。

2.5 為project2添加lib1和lib2

這個(gè)操作對(duì)于讀到這里的你來說應(yīng)該是輕車熟路了,action:

➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) cd ~/submd/ws/project2
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) git submodule add ~/submd/repos/lib1.git libs/lib1
Cloning into libs/lib1...
done.
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git submodule add ~/submd/repos/lib2.git libs/lib2
zsh: correct 'libs/lib2' to 'libs/lib1' [nyae]? n
Cloning into libs/lib2...
done.
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ ls
libs project-infos.txt
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git submodule init
Submodule 'libs/lib1' (/home/henryyan/submd/repos/lib1.git) registered for path 'libs/lib1'
Submodule 'libs/lib2' (/home/henryyan/submd/repos/lib2.git) registered for path 'libs/lib2'
 
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD file>..." to unstage)
#
# new file: .gitmodules
# new file: libs/lib1
# new file: libs/lib2
#
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git commit -a -m "add lib1 and lib2"
[master 8dc697f] add lib1 and lib2
 3 files changed, 8 insertions(+), 0 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 libs/lib1
 create mode 160000 libs/lib2
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) git push
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 471 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
To /home/henryyan/submd/ws/../repos/project2.git
 6e15c68..8dc697f master -> master
 
/file>

我們依次執(zhí)行了添加submodule并commit和push到倉(cāng)庫,此階段任務(wù)完成。

2.6 修改lib1和lib2并同步到project1和project2

假如開發(fā)人員C同時(shí)負(fù)責(zé)project1和project2,有可能在修改project1的某個(gè)功能的時(shí)候發(fā)現(xiàn)lib1或者lib2的某個(gè)組件有bug需要修復(fù),這個(gè)需求多模塊和大型系統(tǒng)中經(jīng)常遇到,我們應(yīng)該怎么解決呢?

假如我的需求如下:

在lib1中添加一個(gè)文件:README,用來描述lib1的功能

在lib2中的lib2-features文件中添加一寫文字:學(xué)習(xí)Git submodule的修改并同步功能

2.6.1 在lib1中添加一個(gè)文件:README

➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) cd libs/lib1
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib1 git:(master) echo "lib1 readme contents" > README
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib1 git:(master) ✗ git add README 
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib1 git:(master) ✗ git commit -m "add file README"
[master 8c666d8] add file README
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib1 git:(master) git push
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 310 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/henryyan/submd/repos/lib1.git
 36ad12d..8c666d8 master -> master

前面提到過現(xiàn)在僅僅只完成了一部分,我們需要在project2中再更新lib1的commit id:

➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git status 
# On branch master
# Changes not staged for commit:
# (use "git add file>..." to update what will be committed)
# (use "git checkout -- file>..." to discard changes in working directory)
#
# modified: libs/lib1 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git add libs/lib1
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git commit -m "update lib1 to lastest commit id"
[master ce1f3ba] update lib1 to lastest commit id
 1 files changed, 1 insertions(+), 1 deletions(-)
/file>/file>

我們暫時(shí)不push到倉(cāng)庫,等待和lib2的修改一起push。

2.6.2 在lib2中的lib2-features文件添加文字

➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) cd libs/lib2
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib2 git:(master) echo "學(xué)習(xí)Git submodule的修改并同步功能" >> lib2-features 
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib2 git:(master) ✗ git add lib2-features 
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib2 git:(master) ✗ git commit -m "添加文字:學(xué)習(xí)Git submodule的修改并同步功能"
[master e372b21] 添加文字:學(xué)習(xí)Git submodule的修改并同步功能
 1 files changed, 1 insertions(+), 0 deletions(-)
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib2 git:(master) git push
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 376 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/henryyan/submd/repos/lib2.git
 7290dce..e372b21 master -> master
 
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib2 git:(master) echo "學(xué)習(xí)Git submodule的修改并同步功能" >> lib2-features 
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib2 git:(master) ✗ git add lib2-features 
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib2 git:(master) ✗ git commit -m "添加文字:學(xué)習(xí)Git submodule的修改并同步功能"
[master e372b21] 添加文字:學(xué)習(xí)Git submodule的修改并同步功能
 1 files changed, 1 insertions(+), 0 deletions(-)
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib2 git:(master) git push
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 376 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/henryyan/submd/repos/lib2.git
 7290dce..e372b21 master -> master
➜ henryyan@hy-hp ~/submd/ws/project2/libs/lib2 git:(master) cd -
~/submd/ws/project2
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git status 
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes not staged for commit:
# (use "git add file>..." to update what will be committed)
# (use "git checkout -- file>..." to discard changes in working directory)
#
# modified: libs/lib2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git add libs/lib2 
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) ✗ git commit -m "update lib2 to lastest commit id"
[master df344c5] update lib2 to lastest commit id
 1 files changed, 1 insertions(+), 1 deletions(-)
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) git status 
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 776 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
To /home/henryyan/submd/ws/../repos/project2.git
 8dc697f..df344c5 master -> master
/file>/file>

2.7 同步project2的lib1和lib2的修改到project1

現(xiàn)在project2已經(jīng)享受到了最新的代碼帶來的快樂,那么既然project1和project2屬于同一個(gè)風(fēng)格,或者調(diào)用同一個(gè)功能,要讓這兩個(gè)(可能幾十個(gè))項(xiàng)目保持一致。

➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) cd ../project1
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) git pull
Already up-to-date.

看看上面的結(jié)果對(duì)嗎?為什么lib1和lib2更新了但是沒有顯示new commits呢?說到這里我記得剛剛開始學(xué)習(xí)的時(shí)候真得要暈死了,Git跟我玩捉迷藏游戲,為什么我明明提交了但是從project1更新不到任何改動(dòng)呢?

幫大家分析一下問題,不過在分析之前先看看當(dāng)前(project1和project2)的submodule狀態(tài):

# project2 的狀態(tài),也就是我們剛剛修改后的狀態(tài)
➜ henryyan@hy-hp ~/submd/ws/project2 git:(master) git submodule 
 8c666d86531513dd1aebdf235f142adbac72c035 libs/lib1 (heads/master)
 e372b21dffa611802c282278ec916b5418acebc2 libs/lib2 (heads/master)
 
# project1 的狀態(tài),等待更新submodules
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) git submodule 
 36ad12d40d8a41a4a88a64add27bd57cf56c9de2 libs/lib1 (remotes/origin/HEAD)
 7290dce0062bd77df1d83b27dd3fa3f25a836b54 libs/lib2 (heads/master)

 兩個(gè)項(xiàng)目有兩個(gè)區(qū)別:

  • commit id各不相同
  • libs/lib1所處的分支不同

2.7.1 更新project1的lib1和lib2改動(dòng)

我們還記得剛剛在project2中修改的時(shí)候把lib1和lib2都切換到了master分支,目前project1中的lib1不在任何分支,我們先切換到master分支:

➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) cd libs/lib1
➜ henryyan@hy-hp ~/submd/ws/project1/libs/lib1 git checkout master
Previous HEAD position was 36ad12d... update lib1-features by developer B
Switched to branch 'master'
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
➜ henryyan@hy-hp ~/submd/ws/project1/libs/lib1 git:(master) git pull
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/henryyan/submd/repos/lib1
 36ad12d..8c666d8 master  -> origin/master
Updating c22aff8..8c666d8
Fast-forward
 README  | 1 +
 lib1-features | 1 +
 2 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 README
➜ henryyan@hy-hp ~/submd/ws/project1/libs/lib1 git:(master) 

果不其然,我們看到了剛剛在project2中修改的內(nèi)容,同步到了project1中,當(dāng)然現(xiàn)在更新了project1的lib1,commit id也會(huì)隨之變動(dòng):

➜ henryyan@hy-hp ~/submd/ws/project1/libs/lib1 git:(master) cd ../../
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git status 
# On branch master
# Changes not staged for commit:
# (use "git add file>..." to update what will be committed)
# (use "git checkout -- file>..." to discard changes in working directory)
#
# modified: libs/lib1 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git diff
diff --git a/libs/lib1 b/libs/lib1
index 36ad12d..8c666d8 160000
--- a/libs/lib1
+++ b/libs/lib1
@@ -1 +1 @@
-Subproject commit 36ad12d40d8a41a4a88a64add27bd57cf56c9de2
+Subproject commit 8c666d86531513dd1aebdf235f142adbac72c035
/file>/file>

現(xiàn)在最新的commit id和project2目前的狀態(tài)一致,說明真的同步了;好的,現(xiàn)在可以使用相同的辦法更新lib2了:

➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ cd libs/lib2
➜ henryyan@hy-hp ~/submd/ws/project1/libs/lib2 git:(master) git pull
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/henryyan/submd/repos/lib2
 7290dce..e372b21 master  -> origin/master
Updating 7290dce..e372b21
Fast-forward
 lib2-features | 1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

2.7.2 更新project1的submodule引用

在2.7.1中我們更新了project1的lib1和lib2的最新版本,現(xiàn)在要把最新的commit id保存到project1中以保持最新的引用。

➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git status
# On branch master
# Changes not staged for commit:
# (use "git add file>..." to update what will be committed)
# (use "git checkout -- file>..." to discard changes in working directory)
#
# modified: libs/lib1 (new commits)
# modified: libs/lib2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) ✗ git commit -a -m "update lib1 and lib2 commit id to new version"
[master 8fcca50] update lib1 and lib2 commit id to new version
 2 files changed, 2 insertions(+), 2 deletions(-)
➜ henryyan@hy-hp ~/submd/ws/project1 git:(master) git push
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 397 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/henryyan/submd/ws/../repos/project1.git
 c96838a..8fcca50 master -> master
/file>/file>

2.8 更新project1-b項(xiàng)目的子模塊(使用腳本)

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) git pull
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/henryyan/submd/ws/../repos/project1
 c96838a..8fcca50 master  -> origin/master
Updating c96838a..8fcca50
Fast-forward
 libs/lib1 | 2 +-
 libs/lib2 | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git status
# On branch master
# Changes not staged for commit:
# (use "git add file>..." to update what will be committed)
# (use "git checkout -- file>..." to discard changes in working directory)
#
# modified: libs/lib1 (new commits)
# modified: libs/lib2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
/file>/file>

Git提示lib1和lib2有更新內(nèi)容,這個(gè)判斷的依據(jù)來源于submodule commit id的引用。

現(xiàn)在怎么更新呢?難道還是像project1中那樣進(jìn)入子模塊的目錄然后git checkout master,接著git pull?

而且現(xiàn)在僅僅才兩個(gè)子模塊、兩個(gè)項(xiàng)目,如果在真實(shí)的項(xiàng)目中使用的話可能幾個(gè)到幾十個(gè)不等,再加上N個(gè)submodule,自己算一下要怎么更新多少個(gè)submodules?

例如筆者現(xiàn)在做的一個(gè)項(xiàng)目有5個(gè)web模塊,每個(gè)web模塊引用公共的css、js、images、jsp資源,這樣就有20個(gè)submodule需要更新!!!

工欲善其事,必先利其器,寫一個(gè)腳本代替手動(dòng)任務(wù)。

2.8.1 牛刀小試

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ grep path .gitmodules | awk '{ print $3 }' > /tmp/study-git-submodule-dirs
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ cat /tmp/study-git-submodule-dirs
 libs/lib1
 libs/lib2

我們通過分析.gitmodules文件得出子模塊的路徑,然后就可以根據(jù)這些路徑進(jìn)行更新。

2.8.2 上路

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ mkdir bin
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ vi bin/update-submodules.sh

把下面的腳本復(fù)制到bin/update-submodules.sh中:

#!/bin/bash
grep path .gitmodules | awk '{ print $3 }' > /tmp/study-git-submodule-dirs
 
# read
while read LINE
do
 echo $LINE
 (cd ./$LINE  git checkout master  git pull)
done  /tmp/study-git-submodule-dirs

稍微解釋一下上面的腳本執(zhí)行過程:

  • 首先把子模塊的路徑寫入到文件/tmp/study-git-submodule-dirs中;
  • 然后讀取文件中的子模塊路徑,依次切換到master分支(修改都是在master分支上進(jìn)行的),最后更新最近改動(dòng)。

2.8.3 2013-01-19更新

網(wǎng)友@紫煌給出了更好的辦法,一個(gè)命令就可以代替上面的bin/update-submodules.sh的功能:

git submodule foreach git pull

此命令也腳本一樣,循環(huán)進(jìn)入(enter)每個(gè)子模塊的目錄,然后執(zhí)行foreach后面的命令。

該后面的命令可以任意的,例如 git submodule foreach ls -l 可以列出每個(gè)子模塊的文件列表

2.8.3 體驗(yàn)工具帶來的便利

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git submodule 
+36ad12d40d8a41a4a88a64add27bd57cf56c9de2 libs/lib1 (heads/master)
+7290dce0062bd77df1d83b27dd3fa3f25a836b54 libs/lib2 (heads/master)
 
# 添加執(zhí)行權(quán)限
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ chmod +x ./bin/update-submodules.sh
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ ./bin/update-submodules.sh 
libs/lib1
Already on 'master'
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/henryyan/submd/repos/lib1
  36ad12d..8c666d8 master   -> origin/master
Updating 36ad12d..8c666d8
Fast-forward
 README |  1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README
libs/lib2
Switched to branch 'master'
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/henryyan/submd/repos/lib2
  7290dce..e372b21 master   -> origin/master
Updating 7290dce..e372b21
Fast-forward
 lib2-features |  1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git submodule 
 8c666d86531513dd1aebdf235f142adbac72c035 libs/lib1 (heads/master)
 e372b21dffa611802c282278ec916b5418acebc2 libs/lib2 (heads/master)
 
 ➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git status 
# On branch master
# Untracked files:
#  (use "git add file>..." to include in what will be committed)
#
#  bin/
nothing added to commit but untracked files present (use "git add" to track)
/file>

更新之后的兩個(gè)變化:

  • git submodule的結(jié)果和project2的submodule commit id保持一致;
  • project1-b不再提示new commits了。

現(xiàn)在可以把工具添加到倉(cāng)庫了,當(dāng)然你可以很驕傲的分享給其他項(xiàng)目組的同事。

➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git add bin/update-submodules.sh 
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git commit -m "添加自動(dòng)更新submodule的快捷腳本^_^"
[master 756e788] 添加自動(dòng)更新submodule的快捷腳本^_^
 1 files changed, 9 insertions(+), 0 deletions(-)
 create mode 100755 bin/update-submodules.sh
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) git push
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 625 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
To /home/henryyan/submd/ws/../repos/project1.git
  8fcca50..756e788 master -> master

2.9 新進(jìn)員工加入團(tuán)隊(duì),一次性Clone項(xiàng)目和Submodules

一般人使用的時(shí)候都是使用如下命令:

git clone /path/to/repos/foo.git
git submodule init
git submodule update

新員工不耐煩了,嘴上不說但是心里想:怎么那么麻煩?

上面的命令簡(jiǎn)直弱暴了,直接一行命令搞定:

git clone --recursive /path/to/repos/foo.git

–recursive參數(shù)的含義:可以在clone項(xiàng)目時(shí)同時(shí)clone關(guān)聯(lián)的submodules。

git help 對(duì)其解釋:

--recursive, --recurse-submodules
   After the clone is created, initialize all submodules within, using their default settings. This is equivalent to running git
   submodule update --init --recursive immediately after the clone is finished. This option is ignored if the cloned repository
   does not have a worktree/checkout (i.e. if any of --no-checkout/-n, --bare, or --mirror is given)

2.9.1 使用一鍵方式克隆project2

➜ henryyan@hy-hp ~/submd/ws git clone --recursive ../repos/project2.git project2-auto-clone-submodules
Cloning into project2-auto-clone-submodules...
done.
Submodule 'libs/lib1' (/home/henryyan/submd/repos/lib1.git) registered for path 'libs/lib1'
Submodule 'libs/lib2' (/home/henryyan/submd/repos/lib2.git) registered for path 'libs/lib2'
Cloning into libs/lib1...
done.
Submodule path 'libs/lib1': checked out '8c666d86531513dd1aebdf235f142adbac72c035'
Cloning into libs/lib2...
done.
Submodule path 'libs/lib2': checked out 'e372b21dffa611802c282278ec916b5418acebc2'
舒服……

3.移除Submodule

牢騷:搞不明白為什么git不設(shè)計(jì)一個(gè)類似:git submodule remove的命令呢?

我們從project1.git克隆一個(gè)項(xiàng)目用來練習(xí)移除submodule:

➜ henryyan@hy-hp ~/submd/ws git clone --recursive ../repos/project1.git project1-remove-submodules
Cloning into project1-remove-submodules...
done.
Submodule 'libs/lib1' (/home/henryyan/submd/repos/lib1.git) registered for path 'libs/lib1'
Submodule 'libs/lib2' (/home/henryyan/submd/repos/lib2.git) registered for path 'libs/lib2'
Cloning into libs/lib1...
done.
Submodule path 'libs/lib1': checked out '8c666d86531513dd1aebdf235f142adbac72c035'
Cloning into libs/lib2...
done.
Submodule path 'libs/lib2': checked out 'e372b21dffa611802c282278ec916b5418acebc2'
➜ henryyan@hy-hp ~/submd/ws cd !$
➜ henryyan@hy-hp ~/submd/ws cd project1-remove-submodules

3.1 Step by

1、刪除git cache和物理文件夾

➜ henryyan@hy-hp ~/submd/ws/project1-remove-submodules git:(master) git rm -r --cached libs/
rm 'libs/lib1'
rm 'libs/lib2'
➜ henryyan@hy-hp ~/submd/ws/project1-remove-submodules git:(master) ✗ rm -rf libs

2、刪除.gitmodules的內(nèi)容(或者整個(gè)文件) 因?yàn)楸纠挥袃蓚€(gè)子模塊,直接刪除文件:

➜ henryyan@hy-hp ~/submd/ws/project1-remove-submodules git:(master) ✗ rm .gitmodules

如果僅僅刪除某一個(gè)submodule那么打開.gitmodules文件編輯,刪除對(duì)應(yīng)submodule配置即可。

3、刪除.git/config的submodule配置 源文件:

[core]
  repositoryformatversion = 0 
  filemode = true
  bare = false
  logallrefupdates = true
[remote "origin"]
  fetch = +refs/heads/*:refs/remotes/origin/*
  url = /home/henryyan/submd/ws/../repos/project1.git
[branch "master"]
  remote = origin
  merge = refs/heads/master
[submodule "libs/lib1"]
  url = /home/henryyan/submd/repos/lib1.git
[submodule "libs/lib2"]
  url = /home/henryyan/submd/repos/lib2.git

刪除后:

[core]
  repositoryformatversion = 0 
  filemode = true
  bare = false
  logallrefupdates = true
[remote "origin"]
  fetch = +refs/heads/*:refs/remotes/origin/*
  url = /home/henryyan/submd/ws/../repos/project1.git
[branch "master"]
  remote = origin
  merge = refs/heads/master

4、提交更改

➜ henryyan@hy-hp ~/submd/ws/project1-remove-submodules git:(master) ✗ git status
# On branch master
# Changes to be committed:
#  (use "git reset HEAD file>..." to unstage)
#
#  deleted:  libs/lib1
#  deleted:  libs/lib2
#
# Changes not staged for commit:
#  (use "git add/rm file>..." to update what will be committed)
#  (use "git checkout -- file>..." to discard changes in working directory)
#
#  deleted:  .gitmodules
#
➜ henryyan@hy-hp ~/submd/ws/project1-remove-submodules git:(master) ✗ git add .gitmodules
➜ henryyan@hy-hp ~/submd/ws/project1-remove-submodules git:(master) ✗ git commit -m "刪除子模塊lib1和lib2"
[master 5e2ee71] 刪除子模塊lib1和lib2
 3 files changed, 0 insertions(+), 8 deletions(-)
 delete mode 100644 .gitmodules
 delete mode 160000 libs/lib1
 delete mode 160000 libs/lib2
➜ henryyan@hy-hp ~/submd/ws/project1-remove-submodules git:(master) git push
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 302 bytes, done.
Total 2 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
To /home/henryyan/submd/ws/../repos/project1.git
  756e788..5e2ee71 master -> master
/file>/file>/file>

4.結(jié)束語

對(duì)于Git Submodule來說在剛剛接觸的時(shí)候多少會(huì)有點(diǎn)凌亂的趕緊,尤其是沒有接觸過svn:externals。

本文從開始創(chuàng)建項(xiàng)目到使用git submodule的每個(gè)步驟以及細(xì)節(jié)、原理逐一講解,希望到此讀者能駕馭它。

學(xué)會(huì)了Git submdoule你的項(xiàng)目中再也不會(huì)出現(xiàn)大量重復(fù)的資源文件、公共類庫,更不會(huì)出現(xiàn)多個(gè)版本,甚至一個(gè)客戶的多個(gè)項(xiàng)目風(fēng)格存在各種差異。

來源: http://www.kafeitu.me/git/2012/03/27/git-submodule.html>

拉取所有子模塊

git submodule foreach git pull
git submodule foreach --recursive git submodule init 
git submodule foreach --recursive git submodule update 

到此這篇關(guān)于Git Submodule使用完整教程(小結(jié))的文章就介紹到這了,更多相關(guān)Git Submodule使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • git中submodule子模塊的添加、使用和刪除的示例代碼
  • 詳解git submodule使用以及注意事項(xiàng)

標(biāo)簽:鄂爾多斯 丹東 錫林郭勒盟 莆田 雙鴨山 遵義 襄陽 哈爾濱

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Git Submodule使用完整教程(小結(jié))》,本文關(guān)鍵詞  Git,Submodule,使用,完整,教程,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Git Submodule使用完整教程(小結(jié))》相關(guān)的同類信息!
  • 本頁收集關(guān)于Git Submodule使用完整教程(小結(jié))的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 宁波力源机械有限公司| 苏州海盛精密机械有限公司| 南京寿旺机械设备有限公司| 东莞通盛机械有限公司| 重庆宏工工程机械有限公司| 压机械制造有限公司| 杭州海兴机械有限公司| 南京重霸起重设备有限公司| 烟台利丰机械有限公司| 东莞市实诚机械有限公司| 首都航天机械有限公司| 乙盛机械工业有限公司| 江苏迈安德食品机械有限公司 | 厦门 机械设备有限公司| 浙江 动力机械有限公司| 广州东昇机械有限公司| 江阴市西城钢铁有限公司 | 台湾鸿昌机械有限公司| 日照机械制造有限公司| 天津重型机械有限公司| 浙江瑞德森机械有限公司| 上海清河机械有限公司| 苏州工业园区机械有限公司| 珠海市机械有限公司| 巨荣机械制造有限公司| 郑州锦德润机械设备有限公司| 上海奎星包装机械有限公司| 青岛一津机械有限公司| 无锡永兴机械制造有限公司| 重庆精密机械有限公司| 工程机械有限公司经营范围| 山东明威起重设备有限公司 | 苏州擎邦机械有限公司| 海华机械制造有限公司| 秦皇岛机械有限公司| 锦辉五金机械有限公司| 上海映易包装机械设备有限公司| 广东正力精密机械有限公司 | 新乡黄氏食品机械有限公司| 广东华冠钢铁有限公司| 中山精密机械有限公司| 湖州三一重工有限公司| 潍坊铭金机械有限公司| 启东丰顺重工有限公司| 福建泉工机械有限公司| 浙江鼎业机械设备有限公司| 鼎龙机械制造有限公司| 昆山铭世特精密机械有限公司 | 法麦凯尼柯机械有限公司| 青岛塑料机械有限公司| 泰州机械设备有限公司| 兖矿大陆机械有限公司| 服装有限公司起名大全| 合肥盛安机械有限公司| 江苏舜天机械进出口有限公司| 新乡市利尔机械有限公司| 晋江市机械有限公司| 东平开元机械有限公司| 无锡金比机械有限公司| 常熟飞龙机械有限公司| 汉威机械制造有限公司| 优瑞纳斯液压机械有限公司| 山西美锦钢铁有限公司| 宿迁百通机械有限公司| 贵州机械设备有限公司| 天津京龙工程机械有限公司| 江苏方圣机械有限公司| 哈尔滨机械有限公司| 杭州川禾机械有限公司| 德州市启泰机械设备有限公司| 浙江建达机械有限公司| 濮阳 机械有限公司| 济南天助升降机械有限公司 | 江苏东方重工有限公司| 苏州昌瑞机械有限公司| 印刷包装机械有限公司| 青岛欧普机械设备有限公司 | 浙江宇捷机械有限公司| 南通武藏精密机械有限公司招聘| 上海市机械有限公司| 广州益川机械有限公司| 赣州群星机械有限公司| 杭州力士机械有限公司| 济宁新田工程机械有限公司| 工程机械租赁有限公司| 成都固特机械有限公司| 江阴中立机械工业有限公司| 浙江万通重工有限公司| 重庆恒科机械制造有限公司| 上海善佳机械设备有限公司| 长葛市机械有限公司| 青岛非凡包装机械有限公司| 江苏久保田农机机械有限公司| 快克数控机械有限公司| 常州塑料机械有限公司| 广州磊蒙机械设备有限公司| 济南华工液压机械有限公司| 句容立成强机械有限公司| 上海敏杰机械有限公司| 陕西重型机械制造有限公司| 温州立胜印刷包装机械有限公司 | 东莞鸿铭机械有限公司| 云南旷迪机械有限公司| 河南钢铁贸易有限公司| 福建亿鑫钢铁有限公司| 云南中天机械有限公司| 诺尔起重设备有限公司| 阳煤化工机械有限公司| 沂南县宏发机械有限公司| 江阴兴澄特种钢铁有限公司地址| 沈阳奎鑫钢铁有限公司| 义乌联动机械有限公司| 扬州凯勒机械有限公司| 郑州昌利机械制造有限公司| 宿迁机械制造有限公司| 太仓精密机械有限公司| 北京建筑机械有限公司| 江阴精力机械有限公司| 抚顺起亮食品有限公司| 东莞达成机械设备制造有限公司 | 郑州水工机械有限公司招聘| 机械自动化设备有限公司| 苏州鸿安机械有限公司| 杭州泰尚机械有限公司| 福建晋工机械有限公司| 苏州在田机械有限公司| 宏源机械设备有限公司| 山东巨力机械有限公司| 辽宁富一机械有限公司| 东莞市全永机械制造有限公司 | 福建机械设备有限公司| 威海远兴机械有限公司| 北京印刷机械有限公司| 青岛吉瑞特机械制造有限公司 | 上海辰品食品机械有限公司| 安宁永昌钢铁有限公司| 徐州起重机械有限公司| 无锡盛达机械制造有限公司| 徐州华东机械有限公司| 江苏化工机械有限公司| 苏州纺织机械有限公司| 辽宁机械制造有限公司| 光华机械制造有限公司| 南京儒一航空机械装备有限公司| 莱州 机械有限公司| 机电设备有限公司起名| 汇大机械制造有限公司| 深圳市硕方精密机械有限公司| 江阴市液压机械有限公司| 温州中环机械设备有限公司| 河南世博机械工程有限公司| 江苏环保机械有限公司| 郑州明瑞机械设备有限公司| 六安恒源机械有限公司| 永洋钢铁有限公司电话| 武汉船用机械有限公司| 山东德州恒特重工有限公司| 昆山万利机械有限公司| 苏州通润机械铸造有限公司| 海沃机械扬州有限公司| 昆山市贝纳特机械设备有限公司| 伯曼机械制造有限公司| 邢台德龙钢铁有限公司招聘| 张家港白熊科美机械有限公司| 南昌矿山机械有限公司| 广州 机械设备有限公司| 济南华工液压机械有限公司| 河北水利机械有限公司| 农业发展有限公司起名| 武汉鑫巨力精密机械制造有限公司| 太仓旭升机械有限公司| 宁波星箭航天机械有限公司| 德清恒丰机械有限公司| 杭州千和精密机械有限公司| 上海舒平精工机械有限公司| 东莞市泽源机械有限公司| 柳州富达机械有限公司官网| 洛阳博马农业工程机械有限公司| 常州道铖精密机械有限公司| 天津钢铁贸易有限公司| 温岭市大众精密机械有限公司| 东莞宏起塑胶电子有限公司| 无锡凯希迪斯机械有限公司 | 建筑机械设备有限公司| 上海大恒光学精密机械有限公司| 新兴重工天津国际贸易有限公司| 杭州三共机械有限公司| 大洋食品机械有限公司| 上海尼法机械有限公司| 东莞新宇机械有限公司| 盐城丰炜机械制造有限公司| 天津石油机械有限公司| 广东粤韶钢铁有限公司| 河南真牛起重机有限公司| 铜陵群力机械有限公司| 南通力威机械有限公司| 南通佳宝机械有限公司| 温州市友田包装机械有限公司| 中山市凌宇机械有限公司| 安丘瑞源机械制造有限公司 | 海星机械制造有限公司| 诸城科翔机械有限公司| 济南 建筑机械有限公司| 浙江双联机械有限公司| 嘉兴扬鑫机械有限公司| 烟台福信钢铁有限公司| 江阴戎辉机械设备制造有限公司 | 化工有限公司起名大全| 山东嘉和机械有限公司| 佛山市松可包装机械有限公司| 阳煤化机械有限公司| 机械设备有限公司经营范围| 曲靖呈钢铁有限公司| 上海兴享机械工业有限公司| 青岛万邦包装机械有限公司| 张家港机械制造有限公司| 广意永雄机械有限公司| 龙口富元机械有限公司| 山东瑞浩重型机械有限公司| 芜湖灵芝机械有限公司| 曲阜润丰机械有限公司| 广州晶冠机械有限公司| 宁波友杰机械有限公司| 重庆起重机厂有限公司| 中阳钢铁有限公司官网| 南通腾中机械有限公司| 台州精密机械有限公司| 联征机械设备有限公司| 永华机械有限公司招聘| 河南鼎科机械有限公司| 上海红重机械装备有限公司| 吉林大华机械制造有限公司| 重庆庆达机械有限公司| 上海贝得尔石化机械设备有限公司 | 佛山市信虹精密机械有限公司 | 上海松仕机械设备有限公司| 新乡市东源机械有限公司| 南通龙威机械有限公司| 中船重工海空智能装备有限公司 | 济南章力机械有限公司| 广州机械制造有限公司| 大连孚德机械有限公司| 上海山启机械制造有限公司| 江苏迪鼎机械有限公司| 建材机械制造有限公司| 河南广泰机械有限公司| 青岛永强木工机械有限公司| 杭州誉球机械有限公司| 无锡大昌机械工业有限公司 | 沈阳东荣机械有限公司| 重庆机械制造有限公司| 江苏谷登工程机械装备有限公司| 山东中探机械有限公司| 大连华锐重工有限公司| 河南省中原起重机械有限公司 | 郑州一本机械设备有限公司| 上海旭恒精工机械制造有限公司| 昆山乙盛机械工业有限公司电话| 洛阳机械制造有限公司| 德马格起重机械有限公司| 淄博协丰机械有限公司| 南阳鼎鑫钢铁有限公司| 宏源机械设备有限公司| 沈阳黎明机械有限公司| 陀曼精密机械有限公司| 深圳市 机械 有限公司| 新风工程机械有限公司| 东莞鸿祥机械有限公司| 宁波东力机械制造有限公司| 四川机械设备有限公司| 衡阳华意机械有限公司| 东莞 机械有限公司| 汽车销售有限公司起名| 山东锐驰机械有限公司| 霸州新利钢铁有限公司| 济南天业工程机械有限公司| 西安鸿运机械有限公司| 江西平起实业有限公司| 内蒙古机械有限公司| 浙江希望机械有限公司| 如东通用机械有限公司| 天津宏大纺织机械有限公司 | 新乡市欧霖佳机械有限公司| 宁波五峰机械有限公司| 小森机械南通有限公司| 焦作市机械制造有限公司| 东莞市康旭机械有限公司| 安瑞科气体机械有限公司| 杭州速捷机械有限公司| 重庆动力机械有限公司| 佛山市信虹精密机械有限公司 | 天工机械制造有限公司| 昆山美和机械有限公司| 肥城金塔机械有限公司| 昆山六丰机械工业有限公司| 农业发展有限公司起名| 江南机械制造有限公司| 广州宏兴食品机械有限公司| 上海 精密机械制造有限公司| 山东铭德机械有限公司| 洛阳塑电机械有限公司| 天津聚鑫贵泽钢铁贸易有限公司| 盘锦 机械有限公司| 昆山铭世特精密机械有限公司 | 上海益达机械有限公司| 东莞市森佳机械有限公司| 昆山鹤鑫精密机械有限公司| 佛山市浩铭达机械制造有限公司| 上海岭申机械有限公司| 华群数控机械有限公司| 兴澄特种钢铁有限公司| 青岛机械制造有限公司| 佛山建邦机械有限公司| 丹阳市华泰制药机械有限公司| 浙江鑫辉机械有限公司| 太仓机械设备有限公司| 上海理贝包装机械有限公司| 徐州东南钢铁工业有限公司| 杭州定江机械有限公司| 江苏福克斯机械有限公司| 苏州毕特富精密机械有限公司| 常州曼恩机械有限公司| 华泰机械制造有限公司| 上海德仁橡塑机械有限公司| 靖江机械制造有限公司| 雄雄精密机械有限公司| 沧州重诺机械制造有限公司| 山东大佳机械有限公司| 上海恒麦食品机械有限公司 | 无锡联通焊接机械有限公司| 马鞍山市机械有限公司| 北京大森长空包装机械有限公司 | 昆山拓可机械有限公司| 浙江雷克机械工业有限公司| 宁波特艾科机械制造有限公司 | 山东临沂机械有限公司| 莱州 机械有限公司| 申耀机械工业有限公司| 上海科熙起重设备有限公司 | 龙口海盟机械有限公司| 浙江赛力机械有限公司| 青州市国发包装机械有限公司| 南京精密机械有限公司| 河南矿山起重机有限公司销售电话 | 金马机械制造有限公司| 唐河大华机械有限公司| 天马电子机械有限公司| 兰州联合重工有限公司| 赣州群星机械有限公司| 山东源泉机械有限公司| 中山市 机械有限公司| 南通奥普机械工程有限公司| 深圳市合发齿轮机械有限公司| 湖南工程机械有限公司| 常州市良久机械制造有限公司 | 郑州中意矿山机械有限公司| 机械有限公司 招聘| 重庆地泽机械有限公司| 杭州大精机械制造有限公司| 唐钢唐银钢铁有限公司| 南昌全球机械有限公司| 九江益鑫机械有限公司| 锋劲威机械有限公司| 无锡马牌机械有限公司| 大连卓远重工有限公司| 南通力威机械有限公司| 重庆爱扬机械有限公司| 广州善友机械设备有限公司| 杭州海兴机械有限公司| 鄂州鸿泰钢铁有限公司| 东莞市科环机械设备有限公司 | 惟其信石油机械(天津)有限公司| 陕西至信机械制造有限公司怎么样| 机械化工程有限公司| 芜湖灵芝机械有限公司| 渭南金狮机械有限公司| 山西中宇钢铁有限公司| 江阴凯澄起重机械有限公司| 佛山星光传动机械有限公司| 克朗斯机械有限公司| 飞迈烟台机械有限公司| 烟台金鹏矿业机械有限公司| 江苏泰美环保机械有限公司| 东莞市千岛机械制造有限公司 | 江苏宏程重工有限公司| 富伟精密机械有限公司| 徐工重型机械有限公司| 广东龙辉基业建筑机械有限公司| 亚龙机械制造有限公司| 江苏宏博机械制造有限公司| 木业有限公司起名大全| 宣化金科钻孔机械有限公司| 盐城海德机械制造有限公司| 台州特特机械有限公司| 广州赛威机械有限公司| 上海 食品机械有限公司| 宿迁机械制造有限公司| 浙江流遍机械润滑有限公司| 上海高敦精密机械有限公司| 浙江建达机械有限公司| 山东闽源钢铁有限公司| 福建机械设备有限公司| 河南省黄河防爆起重机有限公司| 扬州精密机械有限公司| 河南鼎科机械有限公司| 山东冠华重工机械有限公司| 苏州苏鹰机械制造有限公司| 精一机械(中山)有限公司| 江苏莱宝机械制造有限公司| 山东大启机械有限公司| 常州久压久机械制造有限公司| 河北宏业机械有限公司| 山西 重工有限公司| 江苏华雕机械有限公司| 江阴长达钢铁有限公司| 江苏申特钢铁有限公司| 沈阳小松工程机械有限公司| 江苏佳粮机械有限公司| 芜湖 机械制造有限公司| 张家港和和机械有限公司| 首钢长治钢铁有限公司地址| 山西中德科工机械制造有限公司 | 温州市润新机械制造有限公司| 鞍山宝得钢铁有限公司招聘岗位| 上海工程机械厂有限公司| 昆明群泰机械有限公司| 徐州福曼随车起重机有限公司 | 青岛美克精密机械有限公司| 南京机械电子有限公司| 嘉兴扬鑫机械有限公司| 山东鲁成起重机械有限公司| 成都海科机械设备制造有限公司| 衡水机械制造有限公司| 苏州斗山工程机械有限公司| 德实机械平湖有限公司| 沈阳三重机械有限公司| 中意机械苏州有限公司| 泉州市机械有限公司| 杭州汽轮机械设备有限公司| 上海天驰制药机械有限公司| 许昌机械制造有限公司| 山东康弘机械有限公司| 江苏博森机械制造有限公司| 佛山市宝索机械制造有限公司| 深圳创能机械有限公司| 河南天力起重机械有限公司| 济南钢铁 有限公司| 上海七洋液压机械有限公司| 上海科瑞机械有限公司| 山东国新起重机械有限公司| 石家庄安瑞科气体机械有限公司| 永明机械制造有限公司| 昆明呈钢钢铁有限公司| 郑州 机械 有限公司| 上海晶程机械有限公司| 广州力净洗涤机械有限公司| 州东方机械有限公司| 东莞包装机械有限公司| 唐山九江钢铁有限公司| 东莞市精密机械制造有限公司| 廊坊畅享机械有限公司| 重庆江增船舶重工有限公司 | 河南正亚机械设备制造有限公司 | 上海又高机械有限公司| 河南矿山起重机有限公司销售电话 | 河南云天起重机械有限公司| 张家港市旺巴巴机械有限公司| 哈尔滨联科包装机械有限公司 | 山东鑫弘重工有限公司| 苏州新和机械有限公司| 上海台新食品机械有限公司| 淮南凯盛重工有限公司| 济南森华精密机械有限公司 | 科达机械制造有限公司| 临沂金盛机械配套有限公司| 博硕机械制造有限公司| 东莞豪力机械有限公司| 新乡黄氏食品机械有限公司| 广州普耐柯数控机械有限公司| 新乡市法斯特机械有限公司| 东莞市精密机械有限公司| 江苏柳工机械有限公司| 上海宝丰机械制造有限公司| 五矿钢铁天津有限公司| 无锡万华机械有限公司| 佛山陶瓷机械有限公司| 天津安东石油机械制造有限公司 | 天津市华天世纪机械有限公司| 芜湖灵芝机械有限公司| 上海定盛机械有限公司| 钜业机械设备有限公司| 江阴新迪机械有限公司| 兰州 机械 有限公司| 上海容安木工机械设备有限公司 | 石家庄聚力特机械有限公司 | 龙口旭鑫机械有限公司| 济南中唐机械设备有限公司| 三明 机械有限公司| 上海胡鑫机械有限公司| 唐山利丰机械有限公司| 济宁通佳机械有限公司| 常州奥恒机械有限公司| 浙江高达机械有限公司| 东营石油机械有限公司| 常州市禾昌机械有限公司| 山东大汉建设机械有限公司 | 华信陶瓷机械有限公司| 浙江印刷机械有限公司| 焦作巨航粮油机械有限公司| 科倍隆南京机械有限公司| 常州朝康机械有限公司| 常州市日中精密机械有限公司| 锦州万得包装机械有限公司| 四川机械制造有限公司| 江苏新益机械有限公司| 常州杰洋精密机械有限公司| 桂林矿山机械有限公司| 三技精密机械有限公司| 江苏维达机械有限公司| 宝钢盐城钢铁有限公司| 大连起重机有限公司| 重庆明天机械有限公司| 青岛西城铸造机械有限公司| 台湾鸿昌机械有限公司| 山东锦坤机械有限公司| 昆山环保机械有限公司| 东莞大同机械有限公司| 南牧机械有限公司招聘| 宁波食品机械有限公司| 常州宏机械有限公司| 上海震伦机械有限公司| 东莞市源机械有限公司| 大连液力机械有限公司| 浙江兴发机械有限公司| 浙江华邦机械有限公司| 无锡工程机械有限公司| 椿中岛机械有限公司| 江苏柳工机械有限公司| 合肥金锡机械有限公司| 遂宁华能机械有限公司| 浙江德孚机械有限公司| 浙江顶峰机械有限公司| 太原 机械 有限公司| 科瑞森机械有限公司| 无锡马牌机械有限公司| 扬州三源机械有限公司| 南阳市 机械有限公司| 重庆晨翔机械有限公司| 山东首钢钢铁贸易有限公司| 潍坊市通用机械有限公司 | 浙江阜康机械有限公司| 青州市三联重工设备制造有限公司 | 武汉泛洲机械制造有限公司| 机械有限公司怎么注册| 江苏青山机械有限公司| 如皋市通达机械制造有限公司| 衡阳华意机械有限公司| 首钢京唐钢铁有限公司| 宁波辉旺机械有限公司| 河北机械制造有限公司| 湖北昌胜机械设备制造有限公司| 杭州机械设备制造有限公司| 湖州机械设备有限公司| 中石化机械有限公司| 广东华鼎机械有限公司| 常州双鸟起重机械有限公司 | 江苏华光双顺机械制造有限公司| 潍坊圣川机械有限公司| 湖北江重机械制造有限公司| 锦辉五金机械有限公司| 博山 机械有限公司| 海门亿峰机械有限公司| 唐山丰润钢铁有限公司| 南方力劲机械有限公司| 江苏环保机械有限公司| 河北圣和农业机械有限公司| 广东美特机械有限公司| 安阳钢铁贸易有限公司| 金瑞机械制造有限公司| 江苏液压机械有限公司| 靖江 机械有限公司| 康铖机械设备有限公司| 菲美得机械有限公司| 新疆 机械有限公司| 临沂盛德机械有限公司| 梁发记机械有限公司| 成都包装机械有限公司| 比力特机械有限公司| 柳州高华机械有限公司| 深圳市合发齿轮机械有限公司| 盐城市成功机械制造有限公司| 广东食品机械有限公司| 无锡威马机械有限公司| 邢台钢铁有限公司官网| 新昌县蓝翔机械有限公司| 吉林牧神机械有限公司| 西安帕吉特精密机械有限公司| 浙江弘润机械制造有限公司 | 诸城市鼎康机械有限公司| 山东嘉和机械有限公司| 徐州凯工机械有限公司| 深圳市鑫宏伟机械设备有限公司| 河北兴华钢铁有限公司| 辽宁中冶石化机械有限公司| 英侨机械制造有限公司| 浙江科鑫重工有限公司| 中意合资 威尼托机械有限公司| 温州精宇机械有限公司| 玉环中本机械有限公司| 重庆国杰工程机械有限公司| 新进精密机械苏州有限公司| 常州龙鹏机械有限公司| 陕西机械制造有限公司| 杭州中亚机械有限公司| 烟台建筑机械有限公司| 邯郸市复液液压机械有限公司| 南京包装机械有限公司| 宁波昌源机械有限公司| 农业机械制造有限公司| 上海山启机械制造有限公司| 南京起重机械总厂有限公司| 重庆晨翔机械有限公司| 无锡锡南铸造机械有限公司| 浙江瑞大机械有限公司| 上海 包装机械有限公司| 广州新麦机械有限公司| 南通密炼捏合机械有限公司| 杭州纳源传动机械有限公司| 济宁天鸿机械有限公司| 瑞安市机械制造有限公司| 嘉泰数控机械有限公司| 广东韶关钢铁有限公司| 西安筑路机械有限公司| 德州仁信印染机械有限公司 | 苏州圣亚精密机械有限公司| 邢台钢铁有限公司官网| 营口隆仁重工有限公司| 山东泰山起重机械有限公司| 东莞市利成机械有限公司| 郑州红星机械有限公司| 苏州威锐机械有限公司| 山东嘉意机械有限公司| 杭州金狮机械有限公司| 江苏汉庭机械制造有限公司| 洛阳中收机械装备有限公司招聘 | 佛山恒力泰机械有限公司| 杭州双金机械有限公司| 东莞市英豪机械有限公司| 慈溪市宏晟机械设备有限公司| 杭州力泰起重机械有限公司| 重庆爱扬机械有限公司| 无锡佳特机械有限公司| 宏机械铸造有限公司| 蚌埠液力机械有限公司| 山东起重设备有限公司| 武汉贝瑞克机械制造有限公司| 浙江海工机械有限公司| 东莞市瑞辉机械制造有限公司| 济南帕特机械有限公司| 徐工基础工程机械有限公司| 河北水利机械有限公司| 上海的纸箱机械有限公司| 重庆科邦机械有限公司| 青岛兰石重型机械设备有限公司| 山东利达工程机械有限公司 | 浙江歌德起重机有限公司| 镇江鸿泰钢铁有限公司| 上海钢铁物资有限公司| 滨州市机械有限公司| 安徽华机械有限公司| 江苏迪迈机械有限公司| 广州海缔机械有限公司| 武汉工程机械有限公司| 瑞安市华东包装机械有限公司| 东莞市天成机械有限公司| 广州万举机械有限公司| 烟台飞达机械有限公司| 珠海市机械有限公司| 青岛青科重工有限公司| 山东云光钢铁有限公司| 浙江德迈机械有限公司| 上海敏杰机械有限公司| 佛山三技精密机械有限公司| 浙江欧森机械有限公司| 扬州扬宝机械有限公司| 沈阳 机械制造有限公司| 河北卓昊机械制造有限公司| 铜陵群力机械有限公司| 浙江濠泰机械有限公司| 上海三都机械有限公司| 扬州 机械有限公司| 张家口中煤嘉益机械制造有限公司| 山东纺织机械有限公司| 国机铸锻机械有限公司| 上海圣起包装机械有限公司| 汕头市包装机械有限公司| 青岛华鑫克斯顿机械有限公司| 武汉泛洲机械制造有限公司| 湖北 机械 有限公司| 常州捷佳创精密机械有限公司| 威海汇鑫化工机械有限公司| 北京骏马机械有限公司| 山西高义钢铁有限公司| 郑州富民机械有限公司| 中山自动化机械有限公司| 滨州市机械有限公司| 威海隆发机械有限公司| 白鸽食品机械有限公司| 东莞市乔锋机械有限公司| 广州旭众食品机械有限公司| 河北联港废钢铁回收有限公司| 广州机械有限公司招聘| 郑州山川重工有限公司| 浙江 机械 有限公司| 机械设备出口有限公司| 东莞市从创机械有限公司| 上海服装机械有限公司| 郑州市机械设备有限公司| 昆明 机械 有限公司| 石家庄米兹机械设备有限公司| 东宇机械设备有限公司| 广州市金王机械设备有限公司 | 青州包装机械有限公司| 上海一达机械有限公司| 浙江中益机械有限公司| 湖北江重机械制造有限公司| 重庆蓝黛动力传动机械有限公司| 河南卫华重型机械有限公司| 上海世邦机械有限公司| 河北永洋钢铁有限公司| 上海巨远塑料机械有限公司| 浙江欧森机械有限公司| 徐州市机械有限公司| 浙江金辉机械有限公司| 抚顺新钢铁有限公司| 淄博协丰机械有限公司| 上海集嘉机械有限公司| 上海橡塑机械有限公司| 泉州机械制造有限公司| 嘉善远景机械有限公司| 广东日钢机械有限公司| 浙江富地机械有限公司| 上海青川机械配件有限公司 | 甘肃机械化建设工程有限公司| 深圳市高郭氏精密机械有限公司| 江阴市博越机械有限公司| 常州聚武机械有限公司| 上海慕鼎机械设备有限公司| 天津英德诺机械设备有限公司| 佛山市钲昌机械设备有限公司| 华天机械制造有限公司| 扬州凯勒机械有限公司| 唐山神州机械有限公司| 蓬莱巨涛海洋工程重工有限公司怎么样 | 宁波住重机械有限公司| 五洋纺织机械有限公司| 江苏长虹涂装机械有限公司| 平湖机械制造有限公司| 潍坊机械制造有限公司| 郑州市天赐重工机械有限公司| 台湾精密机械有限公司| 青岛万邦包装机械有限公司| 湖北创联重工有限公司| 首钢长白机械有限公司| 日照市机械有限公司| 舒勒锻压机械有限公司| 唐山燕山钢铁有限公司| 海之力机械有限公司| 台湾正河源机械配件有限公司| 无锡威华机械有限公司| 江苏润山机械有限公司| 莱州行星机械有限公司| 莆田 机械有限公司| 广州市天烨食品机械有限公司| 中山自动化机械有限公司| 中航起落架有限公司| 烟台天成机械有限公司| 青岛海诺机械制造有限公司| 潍坊重工机械有限公司| 威海光威精密机械有限公司| 河北宏川机械制造有限公司| 瑞安市华东包装机械有限公司 | 宁波博旺机械有限公司| 上海国豪机械制造有限公司| 广州金本机械设备有限公司| 中安重工自动化装备有限公司| 石家庄博锐食品机械有限公司 | 临清 机械有限公司| 百斯特机械有限公司| 曲阜机械设备有限公司| 抚顺石油机械有限公司| 标准缝纫机菀坪机械有限公司| 苏州全彩机械设备有限公司| 郑州中联收获机械有限公司| 合肥盛安机械有限公司| 起帆电缆有限公司上市| 绵阳动力机械有限公司| 杭重工程机械有限公司| 台州工交机械有限公司| 鄂州吴城钢铁有限公司| 上海科劳机械设备有限公司 | 潍坊浩泰机械有限公司| 四川依赛特机械制造有限公司| 如东宏信机械制造有限公司| 广西美鹏机械设备有限公司 | 新乡市大汉振动机械有限公司| 东元精密机械有限公司| 安徽建筑机械有限公司| 宁波东力机械制造有限公司| 三友医疗机械有限公司| 首唐宝生钢铁有限公司| 菲特压片机械有限公司| 章丘丰源机械有限公司| 临沂美联重工有限公司| 重庆舰帏机械有限公司| 纺织机械制造有限公司| 中山市 机械有限公司| 吉林省起点医药有限公司| 上海鹏则机械有限公司| 源田床具机械有限公司| 宁波食品机械有限公司| 宝鸡南车时代工程机械有限公司| 河南华北起重吊钩有限公司 | 郑州博源机械有限公司| 重庆爱扬机械有限公司| 张家港市通惠化工机械有限公司 | 天津市精密机械有限公司| 东莞市天周机械有限公司| 林州中奥机械有限公司| 太原通泽重工有限公司| 浙江欧森机械有限公司| 广东食品机械有限公司| 宁波鑫淼机械有限公司| 唐山瑞兴钢铁有限公司| 龙扬机械)有限公司| 上海创灵包装机械制造有限公司| 精密机械制造有限公司| 浙江德孚机械有限公司| 浙江君鸿机械有限公司| 安徽起重机械有限公司| 广州市善友机械设备有限公司| 山东浩信机械有限公司| 江苏长强钢铁有限公司| 广东烨辉钢铁有限公司| 常州亚美柯机械设备有限公司| 龙海起重工具有限公司| 山东威力重工机床有限公司| 铜梁君卓机械有限公司| 铭诚机械制造有限公司| 河南旭矿机械有限公司| 青岛 木工机械有限公司| 三一汽车起重机械有限公司| 浙江保龙机械有限公司| 浙江兴发机械有限公司| 河南机械设备制造有限公司| 上海环球机械有限公司| 柳州富达机械有限公司官网| 上海丁博重工机械有限公司| 西安筑路机械有限公司| 潍坊元鸣机械有限公司| 常州金源机械设备有限公司| 济南明美机械有限公司| 仙游东亚机械有限公司| 浙江盛维机械有限公司| 北京大铭世进机械设备有限公司 | 淮安华辉机械设备有限公司| 昆山市烽禾升精密机械有限公司 | 洛阳大华重型机械有限公司| 广州德晟机械有限公司| 汉威机械制造有限公司| 扬州恒佳机械有限公司| 韶瑞重工有限公司官网| 精密机械制造有限公司| 长沙远洋机械制造有限公司| 昆山合济机械有限公司| 浙江赛峰机械有限公司| 广东星联精密机械有限公司| 无锡 精密机械有限公司| 广州文穗塑料机械有限公司| 威马农业机械有限公司| 深圳印刷机械有限公司| 苏州欧鼎机械有限公司| 山东欧劲工程机械有限公司| 上海梯诺机械设备有限公司| 广州冠浩机械设备有限公司 | 许昌市机械有限公司| 潍坊市通用机械有限公司| 唐山龙泉机械有限公司| 台州瑞达机械有限公司| 潍坊钰兴机械有限公司| 宁波甬龙机械有限公司| 广东达诚机械有限公司| 常州锐展机械有限公司| 无锡锡南铸造机械有限公司| 宜兴市机械有限公司| 江山重工机械有限公司| 唐山唐银钢铁有限公司| 江苏恒悦机械有限公司| 上海巨远塑料机械有限公司 | 大连典石精密机械有限公司 | 三一汽车起重机械有限公司| 江苏金沃机械有限公司| 三一汽车起重机械有限公司| 南京欧能机械有限公司| 青岛新东机械有限公司| 天津动力机械有限公司| 河北太行机械工业有限公司| 东莞市五全机械有限公司| 扬州意得机械有限公司| 钜业机械设备有限公司| 河南矿山重型起重机械有限公司| 合肥浩凯机械有限公司| 永盛达机械有限公司| 中山凌宇机械有限公司| 象山机械制造有限公司| 宁夏瑞光机械有限公司| 临清 机械有限公司| 永腾弹簧机械设备有限公司| 三门峡化工机械有限公司| 博山 机械有限公司| 上海依澳包装机械有限公司| 佛山 机械有限公司| 长沙聚邦机械设备有限公司 | 青岛金越隆机械有限公司| 上海嘉倍德塑胶机械有限公司| 浙江宏华机械塑胶有限公司| 上海亚遥工程机械有限公司 | 上海法德机械设备有限公司| 山西新泰钢铁有限公司| 天津包装机械有限公司| 苏州恒升机械有限公司| 北京航天振邦精密机械有限公司 | 华泰精密机械有限公司| 青岛德利机械有限公司| 江苏迎阳无纺机械有限公司 | 中车南口机械有限公司| 堃霖冷冻机械有限公司| 山东大华机械有限公司| 湖南德邦重工机械有限公司| 广东穗华机械设备有限公司| 吉林省起点医药有限公司| 北京骏马机械有限公司| 石家庄机械制造有限公司| 扬州凯勒机械有限公司| 连云港机械制造有限公司| 江西钧天机械有限公司| 沧州科信环保机械有限公司| 阜新恒泰机械有限公司| 无锡锡洲机械有限公司| 科润达机械有限公司| 合肥华运机械有限公司| 安阳斯普机械有限公司| 东莞住重塑胶机械有限公司| 东莞市千岛机械制造有限公司| 江西晟浔机械有限公司| 上海威士机械有限公司| 台州启运机械有限公司| 鞍山矿山机械有限公司| 邦贝液压机械有限公司| 河南甲庚机械设备有限公司| 宝力机械有限公司招聘| 浙江大宇轻工机械有限公司| 恒瑞机械制造有限公司| 唐山宏润钢铁有限公司| 上海亚华印刷机械有限公司| 临清 机械有限公司| 宁波雄腾机械有限公司| 龙口旭鑫机械有限公司| 凯达机械制造有限公司| 广东乐善机械有限公司| 河南鼎科机械有限公司| 武安市裕华钢铁有限公司| 骁马机械上海有限公司| 马鞍山 机械有限公司| 衡阳运输机械有限公司| 苏州原禄机械有限公司| 大连华威机械有限公司| 北京大铭世进机械设备有限公司 | 山东欣弘发机械有限公司| 众立机械制造有限公司| 武汉益达建设机械有限公司| 东莞市恒生机械制造有限公司| 江阴 机械制造有限公司| 广州新欧机械有限公司| 无锡锡南铸造机械有限公司| 深圳市鑫宏伟机械设备有限公司| 新乡市新久振动机械有限公司 | 苏州典艺精密机械有限公司| 上海行雄机械有限公司| 东莞市雅康精密机械有限公司| 沈阳德恒机械制造有限公司| 常州市雪龙机械制造有限公司| 山东数控机械有限公司| 山东鲁工机械有限公司| 上海力克机械有限公司| 宁波恒阳机械有限公司| 江苏科力机械有限公司| 浙江濠泰机械有限公司| 安徽泰恒机械制造有限公司|