2015-05-15 30 views
3

我有一個腳本,用於檢出回購,檢出子模塊,然後打印有關子模塊的一些信息,以便用戶知道它們正在處理哪些標籤/分支。git中的可讀取子模塊狀態信息

我自己的工作站上的輸出看起來是這樣的:

 Entering 'SubModuleA', 
     * feature/some_feature_branch, 
     Branch is, 
     feature/some_feature_branch, 
     Tag is, 
     undefined, 
     Entering 'SubModuleB' 
     * (detached from 1.1.9) 
     Branch is 
     HEAD 
     Tag is 
     1.1.9^0 

在這個例子中,主要回購指向子模塊A的特性分支和子模塊B的標籤

但是,當我使用ansible上運行的其他工作站或虛擬機的代碼,輸出看起來不同:

 Entering 'SubModuleA', 
     * (detached from 1234abcd), 
     Branch is, 
     HEAD, 
     Tag is, 
     undefined, 
     Entering 'SubModuleB' 
     * (detached from a1b23c4d) 
     Branch is 
     HEAD 
     Tag is 
     1.1.9^0 

的代碼看起來是這樣的:

git submodule foreach 'git branch | grep \* ; echo Branch is && git rev-parse --abbrev-ref HEAD ; echo Tag is && git name-rev --tags --name-only $(git rev-parse HEAD) ' 

這是一個我發現能夠獲得這種信息的其他示例的大雜燴,但我很難找到一致的東西。

立即在劇本狀態檢查之前的命令是

git submodule init 
git submodule update 

我不知道爲什麼我得到不同的結果。有沒有什麼能夠可靠地打印子模塊的分支名稱和標籤名稱?

回答

2

我認爲你的困惑的根源在於,有關子模塊狀態的唯一信息就是提交ID。考慮多個分支現有資源庫,說,這一個:

克隆它:

$ git https://github.com/githubtraining/hellogitworld.git 
$ cd hellogitworld 

現在,讓犯了一個名爲分支(比如的ID,「主'):

$ git rev-parse master 
ef7bebf8bdb1919d947afe46ab4b2fb4278039b3 

現在,請查看提交ID:

$ git checkout ef7bebf8bdb1919d947afe46ab4b2fb4278039b3 

和運行git status

$ git status 
HEAD detached at ef7bebf 
nothing to commit, working directory clean 

正如你所看到的,即使你已簽出該 對應於一個名爲分支提交ID,git不知道(因爲你 直接找到提交ID,而不是通過名稱查找它)。

這正是如果您克隆包含 子模塊的存儲庫會發生的情況。通過提交編號檢查出子模塊,而不是通過 任何命名的分支。這實際上是一個關鍵功能:它確保 即使分支在 鏈接存儲庫中前進,您也總是可以獲得相同的提交。

在這種情況下,您可以使用git describe命令獲取 分支的名稱。例如:

$ git describe --all 
heads/master 

--all標誌需要爲了得到git describe到 考慮分支名稱和標記。

+1

還要記住,如果一個提交可以在多個分支上創建,那麼它就存在於一個新分支之前。所以你不能真正想到父項目指向哪個分支。它指向一個提交,它可能在多個分支上。 –

+0

不錯!這適用於幾乎所有的東西!還有兩個子模塊可以打印'heads/develop-5-a244b796',其他所有內容都是'tags/SomeTag'或'remotes/origin/feature/SomeFeature'。 – FrustratedWithFormsDesigner