2013-11-26 33 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