简化的故事是,我们在多个服务器(例如QA,Prod)上安装了一个站点。 对于每个环境,Git都设置为另一个分支/标签,并且我们拥有针对所有环境通用的部署脚本,以简化操作。脚本正在获取所需的分支/标记,然后运行以下命令:
GIT_CHECKOUT="${1:-develop}"
git clean --force --quiet
git fetch --all
git pull --all
git checkout $GIT_CHECKOUT
我们对此有一些疑问:
git pull
和git fetch
和git pull
均会失败,虽然可以,但是会向日志中引发无关的错误< / li>
我看了詹金斯的做法,看起来像这样:
> git fetch --tags --progress https://myrepo.com/repo.git +refs/heads/*:refs/remotes/origin/*
> git rev-parse origin/mytag^{commit}
> git rev-parse mytag^{commit}
> git config core.sparsecheckout
> git checkout -f hash-of-commit
> git rev-list --no-walk hash-of-commit
最后是问题:
在部署时,我们应该仅以分离头模式工作吗?听起来确实是一种更稳定的解决方案。
该任务是否有“配方”?这是一项非常常见的任务,尽管如此,我找不到任何在线食谱来使用您自己的bash脚本来完成此任务
答案 0 :(得分:0)
有意义的是,在“分离的HEAD”上尝试拉时会出现错误...因为pull使用上游分支进行合并...如果您在分离的HEAD上,则不会有上游分支。进行git fetch
足以在本地更新远程信息。如果您确实想进行结帐,并且不想照顾是否有肮脏的环境,则可以尝试使用gir reset --hard
。
这就是我要做的:
git clean --force --quiet
git fetch --all
git checkout --detach # disconnect from whatever branch I was working on
git reset --hard $GIT_CHECKOUT
唯一的事情是您没有在本地移动任何东西(例如,没有本地分支与远程分支一起移动)。
答案 1 :(得分:0)
我的看法是这样(未品尝):
GIT_CHECKOUT="${1:-develop}"
# cleanup *every* untracked file and dir
git clean --force -d -x --quiet
# undo every change to untracked files - might disturb update
git reset --hard HEAD
# now the working tree should be *pristine*
# update all tracking branches and tags
git fetch --all --tags
git checkout --detach
# delete any local branch
git for-each-ref --format="%(refname:strip=2)" refs/heads |xargs -r git branch -D
# checkout
git checkout $GIT_CHECKOUT