不能在git中弹出名为stash的东西

时间:2015-03-02 07:14:17

标签: git bash git-stash

我正在尝试编写一组bash命令:

  1. 隐藏当前的变化
  2. 结帐并拉动SOURCE分支
  3. 结帐并拉出TARGET分支
  4. 将TARGET分支与SOURCE分支合并
  5. 将更改推送到TARGET分支
  6. 结帐初始分支
  7. 从存储中弹出更改
  8. 首先,我不知道这是否是使用bash脚本合并两个分支的正确方法 问题是,我在收藏和取消存放命名的藏匿处时遇到了困难。这是我的剧本:

    while getopts "s:t:" option; do
        case "${option}" in
            s) SOURCE=${OPTARG};;
            t) TARGET=${OPTARG};;
        esac
    done
    
    if [ "${SOURCE}" = "" ]; then
        echo "SOURCE argument is missing"
        exit 1
    fi
    
    if [ "${TARGET}" = "" ]; then
        echo "TARGET argument is missing"
        exit 1
    fi
    
    CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
    
    echo "Stash changes..."
    git stash save GIT_DEPLOY_STASH
    
    echo "Checkout and pull ${SOURCE}..."
    git checkout ${SOURCE}
    git pull --rebase origin ${SOURCE}
    
    echo "Checkout and pull ${TARGET}..."
    git checkout ${TARGET}
    git pull --rebase origin ${TARGET}
    
    echo "Merge and push ${SOURCE}..."
    git merge ${SOURCE}
    git push origin ${TARGET}
    
    echo "Checkout ${CURRENT_BRANCH}..."
    git checkout ${CURRENT_BRANCH}
    
    echo "Pop stash..."
    git stash pop stash^{/GIT_DEPLOY_STASH} #<--- THIS ISN'T WORK!
    

    用法示例:

    $ sh ./my-script.sh -s develop -t staging
    

    知道如何克服已命名的藏匿问题吗? 知道如何改进这个脚本吗?

1 个答案:

答案 0 :(得分:3)

git stash pop不允许像stash^{/GIT_DEPLOY_STASH}

那样regexp revision selection

来自git stash documentation

  

当没有&lt; stash&gt;给出,假定存储@ {0},否则必须是 stash @ {&lt; revision&gt;} 形式的引用。

但您可以使用git stash apply

  

与pop不同,&lt; stash&gt;可能是任何提交,看起来像是由存储保存或存储创建创建的提交。

但是,由于您在脚本中使用它,因此您应该使用git stash create,因为它只会创建提交。

  

创建一个存储(它是一个常规提交对象)并返回其对象名,而不将其存储在ref命名空间中的任何位置。 这适用于脚本。它可能不是你想要使用的命令;见上面的“保存”。

所以以这种方式改变你的脚本

echo "Stash changes..."
GIT_DEPLOY_STASH=$(git stash create 2>/dev/null)

if [ -z ${GIT_DEPLOY_STASH}" ] ; then
    echo "Nothing to stash..."
else
    # echo the stash commit. Useful if your script terminates unexpectedly
    echo "GIT_DEPLOY_STASH created ${GIT_DEPLOY_STASH} ..."
fi


# RESET THE WORKING DIR, BECAUSE STASH CREATE ONLY CREATES THE STASH COMMIT
git reset --hard

...

if [ -n "${GIT_DEPLOY_STASH}" ] ; then
   git stash apply ${GIT_DEPLOY_STASH}
fi