git 如何检查本地未提交的更改是否已经存在于远程分支中?

ryoqjall  于 12个月前  发布在  Git
关注(0)|答案(1)|浏览(106)

情况如下:
1.有一个Web服务器,很久以前就建立了,主目录包含3个项目:

  • deploy脚本
  • git repo
  • 包含当前部署代码的目录

1.主要的代码存储是GitHub,但要真正部署更改,开发人员必须将更改额外推送到“服务器”远程。
1.当更改被推送到裸存储库时,post-receive钩子运行deploy脚本。基本上,归结为cd ~/app && git fetch origin && git reset --hard origin/master && restart the service。当然,还有其他命令,但它们与手头的问题无关。
1.有时候,当人们直接在服务器上对文件进行更改,运行脚本,修复bug等时,这些更改然后,* 通常 ,提交到GitHub,并通过CI,PR等。
1.唉,
通常 * 并不意味着 * 总是 *。有时,当一个开发人员部署一个新版本时,git reset --hard origin/master会丢弃其他开发人员所做的所有本地更改。如果这些“软部署”更改尚未提交,它们将永远丢失。
1.为了防止这种情况,在部署脚本中添加了一个额外的检查:git fetch origin; if [[ $(git diff origin/master --stat) != '' ]]; then barf rainbows and abort this; fi
1.这打破了部署工作流程,因为开发人员会在服务器上修复内容,验证它是否有效,将这些更改添加到GitHub,然后尝试以(更)正确的方式部署它们。但是如果他忘记重置更改,检查现在将阻止他部署。
1.当然,你可以在部署前手动通过ssh连接到服务器并进行硬重置,但更糟糕的是,多个开发人员可能会有多个“软部署”的更改,这导致你必须手动检查所有“软部署”文件,并逐个比较这些更改是否已经存在于主分支中。因为有时候它们存在,有时候它们不存在。
我不能从根本上改变这个过程的任何部分。我也不能改变涉及的人员。鉴于这种情况,我想改变部署前检查(#6):“只有在本地更改时才中止,这些更改在远程主服务器中不存在。如果本地存在的所有更改也存在于源/主服务器中,则继续重置和部署脚本的其余部分”。
目前使用的命令git diff origin/master —stat包括“传入”的更改,所以我认为这是不可能的。
我考虑过的一个选择是遍历更改的文件,并根据origin/master逐个检查它们,但这很慢也很麻烦。
有没有更好的方法,饭桶的方法,我只是不知道?

bvn4nwqk

bvn4nwqk1#

这不是防弹的,但它会避免你 * 失去 * 这些变化.

cd blah
git stash save "saving changes so we do not lose them"
git fetch origin
git reset --hard origin/master
git stash pop
restart

字符串
现在的问题是,在执行git stash pop ....时可能会出现冲突。此外,在执行git stash save之前,您应该考虑检查树是否干净(这意味着如果树是干净的,当然也应该避免git stash pop),但这只是偏离了主配方。
所以,至少这应该让你接近解决这个问题.

相关问题