2016-01-21 58 views
1

假設我有一個腳本驅動的構建過程,在兩個易於檢出的工作目錄(一個用於連續構建,一個用於夜間構建)上工作。Git:獲取自動構建的遠程更改

在Subversion中,我將運行svn update進行連續編譯,然後只有在該更新獲得任何更改時才構建。對於每晚構建,我會運行svn update -r{01:00:00 UTC}並在任何情況下構建。

這與svn:externals,甚至與本地修改,只要他們不與來自存儲庫的更新衝突,正常工作。

現在我想向腳本添加Git支持,從master repo的master分支獲取更新,並且正在尋找Git命令來「做正確的事情」。

看過git pull --rebase origin/master

由於我使用Git極其有限的實踐經驗(一兩個小時,算下來,一年半前),我不知道是否會漂浮了我的船,或者等到我變得自滿只我船然後,由於在Git的工作流程,我不知道的東西...

希望得到從原點回購所有更改而不進行事務當前狀態傾銷本地修改,有一次,一個用於狀態作爲給定的時間戳,什麼是正確的Git命令?

+0

可能重複[比較本地git分支與遠程分支?](http://stackoverflow.com/questions/1800783/compare -local-git-branch-with-remote-branch) – Ferrybig

+0

@Ferrybig:diff問題如何在自動化環境中幫助我? *任何情況下*都不會更新我的工作目錄。 – DevSolar

+0

使用該命令,您可以獲得純文本的差異,這是您可能對您提出問題的解釋之一,尤其是當您沒有清楚說明您想要的結果時。 diff命令以平面狀態返回結果而不更改本地副本。你可以編輯你的問題,用圖表顯示運行一個命令之後你期望的結果嗎? – Ferrybig

回答

1

我知道你說你不想轉儲任何地方的變化,但使用CI一工作本地存儲庫(即,一個在那裏你也正在做開發工作)是一個「壞主意」。

將遠程存儲庫的多個克隆存放在不同的目錄中並將它們用於不同目的沒有任何問題。我認爲你過於複雜化你的過程。我會在你的情況下,至少使用三個克隆:

  • 一個地方,你做你的發展從中你做你的CI
  • 一個版本,它總是保持最新與遠程。
  • 一個用於構建特定的歷史快照

在該腳本中,你基本上要做到以下幾點

  • 檢查是否有任何改變上游資源庫,你不有你本地副本
  • 如果是這樣,請更新您的本地副本以包含更改。

我假設你的本地副本是有效的只讀 - 即你不會在該副本中創建任何新的提交。我也是(爲了簡單起見)假設只有一個分支叫master

這些命令處理的第一步

$ git fetch origin 
$ CHANGED=$(git branch -v | grep -q '\[behind')$? 

在此之後,CHANGED將是零,如果你是遠程的背後(即有你需要拉下變化),否則是會1

要搞垮缺少變化,簡單地做

$ git pull 

,然後觸發您的CI版本。

在所有配置項腳本bash可能是這樣的:

cd $REPOSITORY_DIR 
git fetch origin 
CHANGED=$(git branch -v | grep -q '\[behind')$? 

if [ $CHANGED -eq 0 ] 
then 
    git pull 
    start_CI_build() 
fi 

爲每晚構建,它只是

cd $REPOSITORY_DIR 
git fetch 
git pull 
start_nightly_build() 

幾乎肯定在git管道命令,這將給你直接的CHANGED狀態......但對於新工具的人來說,這是一個直接的方法。

對於從特定時間點構建...以及您在這裏遇到顛覆和混帳之間的哲學區別。在git我們更多地使用標籤,而不是日期。但如果你真的需要這樣做,這是在接受的答案this question

+0

謝謝你的回答,我會盡快測試。我知道CI展位的本地變化並不是一個好主意。這是一個更大的CMake框架的一部分,同樣的腳本也做了「實驗性」構建,這是我發現CTest的默認行爲'reset --hard' ....現在我正在尋找一個合適的設置對於'CTEST_UPDATE_CUSTOM' ...好吧,你幫了我,讓我們看看這有多遠。 ;-) – DevSolar

+0

查看'git stash'來保存和恢復本地更改,並檢查你想從臨時本地分支上創建的提交(無頭爲此工作),但我試圖保持簡單,因爲你是新的去玩 – kdopen