1

这更像是一个 shell 脚本问题,而不是一个 git 问题。

我有一个目录结构,类似于:

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

ETC...

我正在为我的每个包使用 git,但我正在尝试运行一个脚本,该脚本将从远程为我的每个包提取最新更改。我目前有一个包目录列表,但我想: 1 - 遍历每个包目录 2 - 对于每个包目录,获取我所在的当前分支并将其存储在一个变量中

我目前停留在第 2 步,因为我不确定如何导航到目录,运行“git branch”命令,解析它,然后将输出吐出到变量中。我可以单独完成每个步骤,但我无法将它们放在一起。

这是我目前拥有的:

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

将命令的输出替换到行中的语法是$(...), not ${...}。所以应该是:

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

对于获取分支名称,如果您使用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 回答