1

これは、git の問題というよりも、シェル スクリプトに関する質問です。

次のようなディレクトリ構造があります。

/projects/Project1/package1 
/projects/Project1/package2
/projects/Project1/package3

等...

各パッケージに git を使用していますが、各パッケージのリモートから最新の変更を取得するスクリプトを実行しようとしています。私は現在、パッケージディレクトリのリストを持っていますが、次のことをしたいと思います: 1 - 各パッケージディレクトリを反復処理する 2 - 各パッケージディレクトリについて、現在のブランチを取得し、変数に保存します

ディレクトリに移動し、「git branch」コマンドを実行して解析し、出力を変数に吐き出す方法がわからないため、現在ステップ2で立ち往生しています。これらの各ステップを個別に行うことはできますが、まとめることはできません。

これは私が現在持っているものです:

for pkgName in `ls "$WORKSPACE"/src/`
do
    pkgDir="$WORKSPACE"/src/"$pkgName"
    CURRENT_BRANCH=${cd $pkgDir && `git branch 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/\1/"`}
    echo $CURRENT_BRANCH
    #... checkout to mainline, pull, then checkout $CURRENT_BRANCH and rebase mainline...
done

基本的に、ディレクトリの git ブランチ名を「$CURRENT_BRANCH」に割り当てたいと思います。

4

3 に答える 3

0

ブランチ名を取得するために を使用するgit rev-parse --abbrev-ref HEADと、完了であり、後でフィルタリングする必要はありません。

これは機能します:

for pkgName in `ls "$WORKSPACE"/src/`
do
    cd ${WORKSPACE}/src/${pkgName}
    CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
    echo $CURRENT_BRANCH
done
于 2013-11-11T04:50:14.050 に答える
0

現在のブランチを取得する一般的な方法はgit symbolic-ref HEAD(および文字列置換) です。HEAD実際にブランチにいる場合は、現在のブランチを指すことが多いためです。このスニペットの展開を確認できます。

合計で、私は書くでしょう

for pkgDir in "$WORKSPACE"/src/* ; do
  cd "$pkgDir"
  ref=$(command git symbolic-ref HEAD 2>/dev/null)
  CURRENT_BRANCH=${ref#refs/heads/}
  cd -
done
于 2013-11-11T02:58:04.903 に答える
0

コマンドの出力を行に置き換える構文は$(...)、 ではなく${...}です。したがって、次のようになります。

CURRENT_BRANCH=$(cd $pkgDir && git branch 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/\1/")
于 2013-11-11T02:45:37.303 に答える