我在一个团队中工作,我们在功能分支中进行所有开发,当功能完成后,我们将它们合并回主分支(称为开发)。我们会定期对我们的软件进行正式的可用性测试或演示,因此我们专门针对那些在合并到测试分支之前修改测试环境配置部分的测试分支。
作为一个超级懒惰的人,我决定编写创建暂存分支的过程,但是我已经足够git了,我想确定我没有编写一个函数会回来再次咬我。所以这是我的函数(所有这些都在我的.bashrc中):
alias updateDev='git stash && git rebase -m -X theirs development && git stash pop'
function newTest() {
updateDev
git checkout -b staging-test-$1
git push origin staging-test-$1
}
以下是预期用途:
newTest 1.3.7
这就是我认为正在发生的事情:
此代码中的任何内容的工作方式是否与我预期的不同,或者此代码中的任何内容都可以改进以更可靠地工作?
感谢您的帮助!
答案 0 :(得分:2)
嗯,很大程度上取决于你想成为多么偏执。
你可以做的一个显而易见的事情是验证函数至少或确切地存在一个参数,以便$1
扩展为:
case $# in
1) ;;
*) echo "usage: newTest <name>" 1>&2; return 1;;
esac
另一个是确保分支名称有效。每git-check-ref-format
:
local ref
ref=$(git check-ref-format --normalize "refs/heads/staging-test-$1") ||
{ echo "'staging-test-$1' is not a valid branch name" 1>&2; return 1; }
虽然你可能想再次剥离refs / heads / off:
ref=${ref#refs/heads/}
之后您可以使用$ref
来避免重复staging-test-
部分。
然后:如果该分支名称已经存在怎么办?这是一个错误,还是应该被替换? (要使其成为错误,请检查git checkout -b
失败,例如。)
然后:如果存储或rebase失败怎么办?你说“永远不应该有变化”,但可能保存和应用存储的重点是有一些变化。我不清楚updateDev
打算做什么。它不检查当前分支是什么,它只是使用development
将当前分支(无论是什么)重新绑定到-X theirs
(这意味着保留所有内容的“我们的”版本)。
此外,假设存储没有更改,但 已经是现有存储。在这种情况下,git stash
会在打印No local changes to save
后成功退出。然后updateDev
脚本将运行rebase,并假设它成功,将弹出(应用和删除)最顶层的现有存储。这几乎肯定不是一件好事。
上一篇:如果git checkout -b
和/或git push
失败怎么办? (例如,由于磁盘空间不足或同样可怕的东西,或仅仅因为提供的名称已经存在。)