2012-01-25 85 views
2

有人可以幫助我填寫缺少的部分到我正在編寫的腳本中嗎?我剛剛意識到我有一個公共存儲庫,其中包含對我從未推送到源的子模塊中的提交的引用(提交在推送前重新組織)。我不知道發生了多少次,但我想找出並創建臨時分支以推動起源。查找從未推送到公共存儲庫的子模塊提交

所以,回到腳本。我知道,我能得到所有提交的清單,修改了自己的子模塊,這我可以grep過濾和使用cutmy_submodule得到實際的SHA1標籤:

git log -u origin/master -- my_submodule \ 
    | grep "^\+Subproject" \ 
    | cut -d" " -f 3 

在這一點上,我有20個標籤和我只是用一個文本編輯器來創建一個腳本,用「tag_00xx」手動標記每一個腳本。然後我在Git Extensions中手動檢查存儲庫,並刪除了任何使其成爲origin/master的提交標記,並留下了從未推送的標記。

我應該怎麼做才能創建不屬於origin/master的提交標籤?我知道我可以這樣做:

git branch -r --contains <commit_sha1> 

但是,這並不設置退出代碼我可以用它來選擇創建新的標籤。我怎麼能完成我的任務的自動化?

回答

1

我可能做到這一點通過以下方式 - 首先,你可以通過執行列出所有提交的子模塊的版本沒有grepcut

git rev-list origin/master | while read COMMIT 
do 
    SUBMODULE_COMMIT=$(git rev-parse $COMMIT:my_submodule 2> /dev/null) 
    if [ $? = 0 ] 
    then 
     echo $SUBMODULE_COMMIT 
    fi 
done | sort | uniq > committed-submodule-versions 

然後,對每個那些,你需要轉入子模塊並檢查它是否在origin/master。可能最簡單的方法是grep git branch -r --contains <SUBMODULE-COMMIT>的輸出,因爲那樣你可以使用grep的退出代碼。

例如:

cd my_submodule 
while read S 
do 
    if git rev-parse --verify $S > /dev/null 2> /dev/null 
    then 
     git branch -r --contains $S 2> /dev/null \ 
      | grep origin/master > /dev/null \ 
      || git branch missing-${S:0:8} $S 
    else 
     echo $S not found in the repository at all 
    fi 

done < ../committed-submodule-versions 

還有一點要注意的是,我要創建分支爲unpushed提交,而不是標籤。原因是git submodule update導致git fetch,但不是git fetch --tags,這意味着不會指向已知提交的標記不會被提取(!)。

+0

感謝Mark,對於這樣一個徹底的答案,它結合了一些高級的shell腳本和對git的更好的理解,而不是我所擁有的......我也很欣賞關於使用分支而不是標籤的注意事項。 – tomlogic

相關問題