我正在寻找一种预先检测git pull
或git merge
是否会失败的方法。我想要执行的那种脚本是更新服务器。
git fetch
git okay
stop server
backup data
git merge
start server
这里git okay
是我要求的命令的占位符。
如果文件在提交之外被更改,则git pull
将失败,并显示以下错误。
error: Your local changes to '...' would be overwritten by merge. Aborting.
Please, commit your changes or stash them before you can merge.
我希望git okay
执行git merge
中描述的预合并检查并返回非零状态,以便脚本在服务器停止之前中止。
我寻找但未找到的可能性包括git merge --dry-run
。我最好的想法是git status --porcelain | pre-merge-okay
。使pre-merge-okay
处理良性未跟踪文件等问题似乎需要付出很多努力。
答案 0 :(得分:0)
您是否尝试使用存储来保存您的工作,然后只是执行合并,知道您以后可以将其退出?我没有尝试过这些确切的命令,但有点像......
git tag remember-your-initial-position
git stash save --all --include-untracked
git merge
if [$? -ne 0]; then
echo "merge will fail"
git merge --abort
else
git stash apply
if [$? -ne 0]; then
echo "reapplying changes after the merge will fail"
else
echo "merge will be ok"
fi
git reset --hard remember-your-initial-position
fi
git stash pop
git tag -d remember-your-initial-position
如果您不想在工作目录中进行更改(例如,您正在从该目录中主动运行服务器),则可以尝试将repo复制到其他位置并在其他位置执行这些步骤,像这样:
pushd .
cp -r . /tmp/copy
cd /tmp/copy
# do the above steps
popd
rm -r /tmp/copy
答案 1 :(得分:0)
似乎没有一种优雅的方式完全符合我的要求,所以我会选择一个简单的解决方案。这意味着我需要清理未跟踪的文件。有些将被删除,其他人将被添加到.gitignore。
test -z "$(git status --porcelain)"