2016-09-02 130 views
1

可以說,我有這樣的承諾樹下面的本地存儲庫,當我從開發創建了一個特性分支f防止用戶更改

master --> a 
      \ 
      \ 
     develop c 
       \ 
       \ 
     feature f 

現在,經過一段時間的新功能有被合併開發c和我犯樹是這個樣子:

master --> a 
      \ 
       \ 
     develop c --> d --> e 
       \ 
       \ 
      feature f 

現在我想確保我沒有從發展拉動的最新變化之前提交。

master --> a 
      \ 
      \ 
     develop c --> d --> e 
          \ 
          \ 
        feature f 

從我都試過了,一個辦法就是推動改變f,然後嘗試合併f開發e(現在有新的變化)。這樣做顯然會拋出git的錯誤信息,說開發工作是在f之前。我非常有信心,這可以通過post-hook完成。但是,我可以用git pre-hook來做到嗎?

如果是這樣,如何做,如果不是,請建議一些其他方式來做到這一點。如果可能的話,請解釋一下命令在做什麼?(我只是git的初學者)

要求是顯示一些自定義消息,以防用戶嘗試這樣做。

在此先感謝!

更新: 我上看起來是這樣的一種解決方案,(後來這個腳本會在被稱爲pre-commit鉤子)

tomato.sh

#!/bin/bash 
WORKING_GIT_DIR=$1 
cd $WORKING_GIT_DIR 
# switch to BRANCH_TO_MERGE 
BRANCH_TO_MERGE=$2 
git checkout $BRANCH_TO_MERGE 

PARENT_BRANCH=$(git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//') 
echo $PARENT_BRANCH 
# in memory merging of feature branch and parent and look for possible conflicts 
git merge-tree `git merge-base FETCH_HEAD $PARENT_BRANCH` FETCH_HEAD $PARENT_BRANCH 

如何運行

sh +x tomato.sh (PATH TO WORKING_GIT_DIR) (BRANCH_TO_MERGE) 

腳本如何工作

它試圖找到父分支(詳情請看[這裏] [2])。 然後使用做了三路合併:

git merge-tree <base> <branch1> <branch2> 

基地 - >當前FETCH_HEAD - 當前父分支
BRANCH1的>找到當前FETCH_HEAD &父母之間的最佳共祖先/最近的父分支
BRANCH2 - 當前父分支>父/最近的父分支

這將在MEM得到ory合併遠程和本地分支而不實際更改索引。

如果有人改進了這個腳本,請發表評論。

在此先感謝!

+0

在分支'develop'上做'git merge feature',解決合併衝突,然後提交。 – Kelvin

+2

你想阻止用戶創建* local *提交?只要讓他們承諾,並在方便時進行合併/重組。 –

+0

@Oliver我認爲這是一個很好的問題。如果回答了,預先提交的鉤子可以防止在沒有通知您的基礎已經改變的情況下開發(=提交)。它可能會拋出一些警告,如「引用已經改變,先做一個合併?[y/n]」。另一方面,你必須提供更多的信息,你的參考是什麼。 – Christoph

回答

1

現在我想確保在從開發中拉取最新更改之前我不承諾。

這是不可能的,因爲在Git修訂的地方

我想你需要的是一個團隊的理解,所有的工作都在推之前制定重建基礎。執行此操作將是代碼審查。

還有可能是在CI中強制執行此操作的技術方法。

+0

你能告訴我更多關於可以在CI中採取的方法嗎? – lordzuko

+0

快速谷歌顯示teamcity可以作爲構建步驟訪問git日誌,但我認爲你的問題是團隊合作而不是技術 –

+0

@ m.edmondson:我同意git提交是本地的。但是你應該可以使用腳本作爲預先提交鉤子,在其他地方完成,並在必要時訪問git命令。我的理解是,鉤子可以用任何語言。見例如一個R例子的[這裏](https://rmflight.github.io/posts/2014/02/incrementalVersionCommitHooks.html)。 – Christoph

1

正如所指出的,普通的git沒有這樣的事情的任何特殊支持,這就是爲什麼像pull request概念已被添加到Git的覆蓋解決方案,如github上和到位桶,而像gerrit工具,方便進行審查組織的政策,訪問等

由於問題標籤爲github,我假設你使用的是,然後我會說你應該忽略本地功能分支的最新狀態,並讓開發人員推動他們從並從中創建一個拉取請求。

如果功能分支在後面,那麼如果發生衝突將出現拉動請求並且不能合併。然後由功能分支開發人員離開球,並使其負責更新功能分支以便將其合併到開發中。


這當然只從由線合併分析自動線,其可能無法檢測概念衝突確定的。可以定義額外的requirements,我認爲如果這是您想要的,可以使用它拒絕合併任何非最新的請求。 更新:剛纔出現了一個問題Check if a PR is up to date with the target branch

+0

我正在嘗試使用'git merge-tree'進行git的三種合併方式,它可以在不實際觸及索引的情況下在內存中執行此操作。有什麼建議麼 ? – lordzuko

+0

我想要構建的這個工具是兩個你提到的兩種情況,'檢查一個PR是否與目標分支最新'是一個會觸發該工具的情況,它會再次調用一個gui工具,我的目的是通過逐行合併分析(目前,我不關心概念衝突)來顯示衝突,以便用戶可以直接轉到可能發生衝突的文件中的特定行。你的見解很有幫助。 – lordzuko