如何抢先git pull merge错误?

时间:2013-11-26 15:34:39

标签: git

我正在寻找一种预先检测git pullgit 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处理良性未跟踪文件等问题似乎需要付出很多努力。

2 个答案:

答案 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)"