2016-03-15 187 views
1

在Gerrit中處理特性分支時,我想將我的特性分支更改推送到主模塊(以便其他人可以使用它)以及我的功能分支(所以我可以繼續努力,而不需要對主人進行更改),但是一旦我推到一個分支,我就不能將gerrit推向另一個分支。Gerrit將相同的變更集推送給主分支和分支

例如,如果我git push HEAD:refs/for/master那麼,隨後的git push HEAD:refs/for/feature將導致:

Total 0 (delta 0), reused 0 (delta 0) 
remote: Processing changes: refs: 1, done  
To ssh://gerrit.server/repo.git 
! [remote rejected] HEAD -> refs/for/feature (no new changes) 
error: failed to push some refs to 'ssh://gerrit.server/repo.git' 

當然也有新的變化,但只是針對不同的分支。

目前,我有兩個選擇:

  1. 推到特性分支,得到它的測試,審查提交&,然後手動將它併入主控和獲取測試,審查提交的&。

    • 這裏的問題是,如果其他的變化都合併到主我拉着主人之間做合併和我的合併提交提交,那麼我們最終得到一個額外的不必要的合併。
  2. 推主,得到它的測試,審查提交&,然後讓我們的格里特大師更新格里特特性分支裁判在那裏它需要。

    • 除了被黑客攻擊之外,有可能導致嚴重錯誤,這不是你想讓別人經常去做的事情。
    • CI服務器僅在主設備上運行測試,不在分支上。

這些解決方案都不是很令人滿意。

理想我想只推到功能分支,然後推到和有格里特意識到,第二個推動是讓提交(或提交)合併,以掌握;或者可選地,推送到主服務器然後推送到特性分支,並讓gerrit意識到這只是一個請求來快速轉發特性分支引用。不幸的是,我還沒有找到任何方法來做到這一點。

是否有一種乾淨的方式將更改或一組更改推送到它們的功能分支和主控?


注意,我們有合併,基於工作流程,而不是基於重訂工作流程,所以它依賴於重訂工作流程的答案會不會對我們有用。

在發現Selecting Merge Base我以爲base選擇是什麼,我一直在尋找,但是當我嘗試git push origin HEAD:refs/for/master其次是git push origin HEAD:refs/for/feature%base=$(git rev-parse origin/feature)推到功能分支以同樣的方式失敗,好像我剛做git push origin HEAD:refs/for/feature即它說[remote rejected]由於(no new changes)


我們也試圖使在格里特項目配置create-new-change-for-all-not-in-target選項,但它在完全相同的方式失敗:

$git commit -am "New commit for feature and master." 
[fix 1234567] New Commit 
19 files changed, 19 insertions(+), 19 deletions(-) 

$git push origin HEAD:refs/for/master 
Counting objects: 48, done. 
Delta compression using up to 12 threads. 
Compressing objects: 100% (25/25), done. 
Writing objects: 100% (25/25), 2.20 KiB, done. 
Total 25 (delta 24), reused 0 (delta 0) 
remote: Resolving deltas: 100% (24/24) 
remote: Processing changes: new: 1, refs: 1, done  
remote: 
remote: New Changes: 
remote: http://gerrit.server/1234 New commit for feature and master. 
remote: 
To ssh://gerrit.server/repo.git 
* [new branch]  HEAD -> refs/for/master 

$git push origin HEAD:refs/for/feature 
Total 0 (delta 0), reused 0 (delta 0) 
remote: Processing changes: refs: 1, done  
To ssh://gerrit.server/repo.git 
! [remote rejected] HEAD -> refs/for/feature (no new changes) 
error: failed to push some refs to 'ssh://gerrit.server/repo.git' 

我也試圖推動新特性分支,然後再mastedr,但如預期的那樣,這導致相同的拒絕。

+0

您是否嘗試過這種方法:先推送到第一個分支,然後簽出第二個分支,將第一個分支合併到它中,然後推送。我認爲問題在於你試圖推送到不同於當前名稱的分支。例如:在featureX上工作並推動主人 – CodeWizard

回答

1

說到Gerrit,我們使用的方法稍有不同。我們不保留主題分支,但我們使用Gerrit提供的變更主題。也就是說,您可以使用git push HEAD:refs/for/master/feature來代替git push HEAD:refs/for/feature提交有關主題的更改。 Gerrit將其視爲這是一個提供「功能」的提交,它最終將合併到主人。您可以對同一主題進行多項更改(它們應該可以映射到開發計算機上的經典本地功能部件)。 Gerrit甚至通過更改主題提供了很好的過濾功能。

然後,如master更新,您可以重新整理您的整個主題並繼續使用master中的代碼開發該功能。當功能準備就緒時,它可以合併到主設備上。

這樣的工作流程使您可以在工作/檢查階段使用主站的最新更改測試新功能。

+0

感謝您的想法fracz,但我並不想真正想通過嘗試讓我們的團隊改變工作流程的麻煩。讓我們使用當前的工作流程非常困難。我發現讓你的工作流程成爲你擁有的工具最簡單的東西總是一個壞主意,而不是適應和修改你的工具,以使它們適合你的工作流程 - 因此尋找一種不需要我們的機會的解決方案流程。 –

+0

然後,IMO你的問題不是由Gerrit造成的。如果您想要更新主控分支,您必須將其與主控分支進行合併或重新綁定,然後按照G.Sylvie Davies的建議,將更改推送到遠程設備。 – fracz

+0

雖然這是一個粗糙的問題。如果我們不使用gerrit,我可以高興地將它推到分支上,並毫無問題地掌握(無需強制推送,我們會拒絕)。 gerrit的問題在於,如果我把gerrit推到分支上,然後gerrit將相同的變化推到master上,它會拒絕gerrit的推送,因爲commit已經被推送到分支(兩者都具有相同的Change-ID,所以gerrit認爲他們是同樣的變化)。 –

1

請參閱my answerGerrit with tracked feature branches:在Gerrit> = 2.11到take into account target branch when determining new changes to open中啓用create-new-change-for-all-not-in-target選項也應該有助於您的情況。

+0

我們剛剛在Gerrit web Gui中爲一個項目啓用了這個設置,並試着做了一個功能分支推送,但是我們仍然因'沒有新的改變'而得到'遠程拒絕'。我們應該能夠在項目級啓用它,還是我們需要在其他任何地方啓用它? –

+0

它應該只在項目級別啓用它。但是,只有在啓用該選項後纔會對工作進行更改。即如果您之前已經推送了原始更改,啓用此選項將不會將相同更改推送到其他分支工作。此選項啓用後,還需要推送原始更改。 – sschuberth

+0

好吧,我已經更新了我的問題,並詳細說明了當我嘗試了您的建議時發生了什麼。謝謝。 –