2014-03-14 46 views
1

由於某種原因,git命令git clone --recursive [email protected]:foo/bar.git並未從 子模塊中取得最新版本。git clone - 遞歸不拉最新的子模塊

對於子模塊「子」,它會回到舊的提交:

$ cd other/sub/ 
$ git log | head -1 
commit 57d0df7269949ef6d5347c5a4556fde7eafef16d 

$ grep -r 57d0df7269949ef6d5347c5a4556fde7eafef16d .git/* 
.git/modules/other/sub/HEAD:57d0df7269949ef6d5347c5a4556fde7eafef16d 
.git/modules/other/sub/logs/HEAD:b0e43d8acf9fc38257b20ab7317b2b86110e8f72 57d0df7269949ef6d5347c5a4556fde7eafef16d Me 
<[email protected]> 1394764688 +0530  checkout: moving from master to 57d0df7269949ef6d5347c5a4556fde7eafef16d 

任何想法,爲什麼發生這種情況?

How do I git clone --recursive and checkout master on all submodules in a single line?的一個答案表明我可能會將子模塊固定到特定的sha,作者說這是正確的方法。在我的情況下,當我執行克隆時,我想在我的主庫和它所指的所有子模塊中獲得最新版本。

如何確認子模塊是否固定在sha 57d0df7269949ef6d5347c5a4556fde7eafef16d?我如何刪除它?

感謝。

回答

1

一個git子模塊是總是固定到一個特定的提交 - 這就是子模塊是如何工作的 - 並且該提交記錄在父存儲庫中。這是爲了確保某種程度的理智 - 如果多人克隆父存儲庫,即使子模塊存儲庫中存在其他提交,它們也將獲得相同版本的子模塊。

如果你要更新的子模塊提交,你需要先更新子模塊:

cd submodule 
git checkout master 
git pull 

然後記錄新提交父庫:

cd .. 
git commit -m 'updated submodule' submodule 

如果你想看到提交到一個子模塊固定,只需運行git submodule,這將返回的輸出是這樣的:

773d95e1dce80acea254465e896394a2eb158336 _posts (heads/posts) 
94a6903384ca271b7e6ff74443ac2eddaf1d1da4 assets (heads/assets) 

第一個字段是提交ID。你也可以用git ls-tree看到這個;在你的資料庫頂層的子模塊:

​​

對於未在頂層的子模塊:

git ls-tree master:path/to/parent | grep <directory_name> 

這應該表現出相同的信息git submodule