2017-07-15 108 views
11

我的產品是IntelliJ的插件。我支持底層IntelliJ平臺的幾個版本,併爲每個版本發佈插件的版本,因爲它們的API經常在版本之間變化。這只是我的工作,所以我開發主人,然後爲其他版本維護一個分支。所以,我的回購協議是這樣的:從git中的分支中查找合併提交

1.6.0 1.6.1-eap1 
.... a---b---c--- master 
     \  \ 
     d-------e--- idea-2017.1 
     \  \ 
     f-------g--- idea-2016.3 
      \  \ 
      ...  ... etc etc 

a是一個穩定的版本,並已被標記爲1.6.0c是一個EAP(測試版)發行版,已被標記爲1.6.1-eap1。這個方案適用於這兩種情況。

偶爾我想創建一個不會進入發佈頻道的開發版本,但用戶可以手動下載並測試,如果他們喜歡的話。我想爲每個平臺生成一個開發版本,因爲開發用戶可以使用任何IntelliJ版本。我能想到的最好的方法是從標記1.6.0(承諾a)創建一個分支,然後從提交d,f等提交對應的分支,我可以將開發分支合併到並創建dev建立於。

假設我想編寫一個腳本來創建和維護這些分支,我如何從標記1.6.0中找到提交d,f等以創建dev構建分支?

+0

難道你不想使用每個IntelliJ版本的最新版本作爲你的開發分支的基礎嗎?即使用c,e和g而不是a,d和f。我認爲那些包含每個版本的最新修補程序,並且是測試新開發的更好基礎。 – lucash

+0

當然,這是可能的,但問題是相同的 - 給定標籤'1.6.1-eap1',我如何找到提交'e','g'等。基本上我想能夠創建來自任何標記版本的分支,這些分支保證將合併提交合併到每個版本分支中。 – Colin

回答

1

對於問題的解決方案將是使用命令「從idea-2016.3這是不在idea-2017,並且最早在idea-2017它是不是在master找到ag最早提交之間」在歷史上同樣對你的:

cf32d9f idea-2017 e 
88f264c idea-2016.3 g 
5bc9fa1 idea-2017 d 
3f460fe idea-2016.3 f 
224cac8 master c 
67620cd master b 

然後找到標有idea-2016.3最新線並打上最新一個,那將是你的提交。

請注意,如果由於版本差異(例如f在隨後的f'中修復了版本差異)而導致出現某些攔截問題,則輸出可能不是理想的。所以我仍然會考慮明確標記。

+0

謝謝,我比我的初始版本更喜歡這個。我使用awk獲取最後一次提交:'awk'$ 2 ==「idea-2017.1」{commit = 1} END {print $ commit}'' – Colin

0

也許最簡單的方法就是在shell腳本中維護一個支持的版本/分支名稱列表?

我想這樣做的原因是如果添加另一個變化:

1.6.0  eap1 eap2 
.... a---b---c---h--- master 
     \  \ \ 
     d-------e---i--- idea-2017.1 
     \  \ \ 
     f-------g---j--- idea-2016.3 
      \  \ \ 
      ...  ... etc etc 

你想要的變化(h)合併到圖中所示的分支機構的負責人,即h合併到eg。分支2017.1應該指向e,這是合併到的正確提交。

你可以做一些事情,找回一個共同的祖先或東西,但我認爲這是不必要的複雜,並不真正買你任何東西。

如果你只是保留一個分支列表,你可以相對容易地停止支持舊版本。

+0

所以我的分支維護腳本已經有分支名稱硬編碼,並且當我支持新版本時,我更新它們。到現在爲止還挺好。問題是,我並不總是想爲這些新功能創建這些開發版本 - 一個經常使用的例子是用戶有一個我無法複製的問題。基於堆棧跟蹤或他們發給我的任何東西,我修復了一個修復程序,但我無法真正測試它。在那種情況下,我想用他們可以測試的修復程序來開發一個開發版,並且我需要根據他們正在運行的版本進行修改。 – Colin

3

這裏是我落得這樣做:

#!/bin/sh 

set -e # Automatically abort if any simple command fails 

die() { 
    echo >&2 "[email protected]" 
    exit 1 
} 

[ "$#" -eq 2 ] || die "Usage: $0 <branch name> <tag>" 

tag_commit=$(git rev-list --abbrev-commit -n 1 $2) 
[ "${tag_commit}" = "" ] && die "No commit found for $2" 

child_commit() { 
    git log --graph --pretty=format:"%h %p" --decorate -20 --first-parent $1 | grep $2 | cut -c 3-10 
} 

branch_2017_1=$(child_commit idea-2017.1 $tag_commit) 
[ "${branch_2017_1}" = "" ] && die "No commit found for idea-2017.1" 

branch_2016_3=$(child_commit idea-2016.3 $branch_2017_1) 
[ "${branch_2016_3}" = "" ] && die "No commit found for idea-2016.3" 

branch_2016_2=$(child_commit idea-2016.2 $branch_2016_3) 
[ "${branch_2016_2}" = "" ] && die "No commit found for idea-2016.2" 

branch_2016_1=$(child_commit idea-2016.1 $branch_2016_2) 
[ "${branch_2016_1}" = "" ] && die "No commit found for idea-2016.1" 

git branch "$1" $tag_commit 
git branch "$1-2017.1" $branch_2017_1 
git branch "$1-2016.3" $branch_2016_3 
git branch "$1-2016.2" $branch_2016_2 
git branch "$1-2016.1" $branch_2016_1 

現在我只更新我的合併和釋放準備的腳本來選擇性地接受一個分支系列的名字,我想我會好。

祕密醬在child_commit功能,從here cribbed。

git log --oneline --source --ancestry-path master idea-2017 idea-2016.3 --not 1.6.0 

輸出是:

相關問題