2013-11-26 28 views
1

我正在寻找一种预先检测git pullgit merge是否会失败的方法。我想要执行的那种脚本是更新服务器。如何抢先gpt pull合并错误?

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

您能否按照您希望工作目录和索引的行为来表达您的问题?这听起来可能是你运行在工作目录之外,运行中的服务器可以更改工作目录中的文件,并且您正在寻找一种方法来测试合并是否会自动解析,而不会打扰任何文件在工作目录中(尽管我不知道你是否在意索引的改变)。 – Mickalot

回答

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 

如果有你不想做的工作目录的变化(例如一个原因,你正在运行的服务器出该目录),你可以尝试复制回购其他地方和其他地方做这些步骤是这样的:

pushd . 
    cp -r . /tmp/copy 
    cd /tmp/copy 
    # do the above steps 
    popd 
    rm -r /tmp/copy 
+0

这将在启用回滚的同时推进部署。这不是我正在寻找的。我想尽早中止部署并手动修复任何问题。 –

0

似乎有不正好做什么我问的一个优雅的方式,所以我会去一个简单的解决方案。这确实意味着我需要清理未跟踪的文件。有些会被删除,其他人会被添加到.gitignore中。

test -z "$(git status --porcelain)" 
+0

当你合并时,你通常最好不要使用肮脏的工作区,所以很好,你正在解决这个问题。一个可能不明显的问题就是如果.gitignore文件被签入并且它发生了变化,那么你的方法可能会失败,因为你有一个当前被忽略的文件,但是下一次更改会停止忽略它,可能会导致您的合并失败。一般来说,要绝对确保你的合并能够工作的唯一安全的方法是实际上*合并,并在其他地方(正如我在我的答案的第二部分中所建议的那样)进行合并通常是微不足道的。 – Mickalot