我正在尝试编写一组bash命令:
首先,我不知道这是否是使用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
知道如何克服已命名的藏匿问题吗? 知道如何改进这个脚本吗?
答案 0 :(得分:3)
git stash pop
不允许像stash^{/GIT_DEPLOY_STASH}
当没有&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