2012-01-25 5 views
2

書き込みしようとしているスクリプトに欠けている部分を記入する手助けがありますか?私は、私が原点にプッシュしなかったサブモジュール内のコミットの参照を含む公開リポジトリを持っていることを認識しました(コミットはプッシュする前に再編成されました)。私は何回起こったのか分かりませんが、私は起点に向かって一時的な枝を見つけて作成したいと思います。公開リポジトリにプッシュされたことのないコミットサブモジュールを見つける

だから、スクリプトに戻ってください。私は私がgrepでフィルタリングしてmy_submoduleから実際のSHA1タグを取得するためにcutを使用することができ、私のサブモジュールへの変更をコミットのリストを得ることができることを知っている:

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

をその時点で、私は20個のタグを持っていたし、私はちょうど "tag_00xx"でそれぞれを手動でタグ付けするためのスクリプトを作成するテキストエディタを使用しました。その後、私はGit Extensionsのリポジトリを手動で見直し、一度もプッシュされていないタグを残して、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にあるかどうかを確認してください。おそらく最も簡単な方法はgit branch -r --contains <SUBMODULE-COMMIT>の出力をgrepすることです。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 updategit fetchになりますが、git fetch --tagsではなく、既知のコミットを指していないタグはフェッチされません(!)ことを意味します。

+0

ありがとうMarkさん、いくつかの高度なシェルスクリプトと私が持っているものよりもgitの理解を組み合わせた徹底的な答えです...タグの代わりにブランチを使用することについての注記にも感謝します。 – tomlogic

関連する問題