2016-06-27 68 views
1

我想如果檢查出的版本是不一樣的記錄在樹中的版本自動更新一個git子模塊作爲我們的編譯系統的一部分時,它是不同步的,即中。自動更新子模塊

目前我做git submodule status ‹path›並檢查所生成輸出的第一個字符是空格(同步)或別的東西(-對於未初始化,+對於超出的同步提交,或U對合並衝突)。

有一些便宜的(在執行時間方面)命令來獲取這些信息?我是否可以比較兩個適當選擇的文件的時間戳以確定子模塊是否需要更新?

+0

檢查選項'--cached'的幫助。 – Gregg

+0

@Gregg你確定嗎?用腸道的說法,「緩存」往往指的是分段區域。所以,我讀了'--cached'標誌爲「不HEAD比較實際狀態但上演的變化,而不是」下落之前,這甚至可能會更昂貴,因爲它必須檢查臨時區域(通常是無一命中)回頭比較HEAD。 – MvG

+0

當文件在索引中時,已知的git中的哈希只需要檢查它(只是散列)和最新的哈希。我不確定,所以這只是一個評論。 – Gregg

回答

0

我不知道這個回答您的問題(一個或多個),但它可能有助於獲得你的最終目標:

git submodule update --checkout [<submodule>] 

這將簽出存儲在樹中的子模塊的版本,除非已檢出的子模塊具有衝突的修改,在這種情況下它會中止。

你可以將其添加爲post-checkout鉤來自動執行。

如果你喜歡住危險的是,你可以使用下面的重置子模塊(一個或多個)之前結賬,以免衝突檢查出的新版本時。

git submodule foreach git reset --hard HEAD 
git submodule foreach git clean -f 

當然,這將消除您在子模塊中所做的任何更改,請謹慎使用。

0

git submodule命令是作爲shell腳本實現的,雖然它的確請求git submodule--helper的一些幫助。該relevant line手頭的問題是這樣的:

git diff-files --ignore-submodules=dirty --quiet -- "$sm_path" 

這區分匹配從不同的一個(+地位)提交(在git submodule status空間)。有其他代碼段落入之前並且用於detect U conflicts(與help of git submodule--helper)或- uninitialized submodules

在我的實驗中,衝突的情況(即父級回購中的合併在子模塊的使用承諾上有衝突的輸入)也導致diff-files命令的非零退出狀態。不過,未初始化的存儲庫未被報告。所以我建議使用以下命令來檢查子模塊是否是最新的:

test -f "$sm_path/.git" -o -d "$sm_path/.git" && \ 
git diff-files --ignore-submodules=dirty --quiet -- "$sm_path"