2016-06-14 95 views
9

讓我們來想象一下在上維護的blerp命令行工具。該工具具有(隱藏的)--version選項,該選項返回其version(假設爲0.1.2),另一個--commit返回從其構建的提交編號。如何在Git中管理版本號?

版本號和提交號都在代碼庫上進行了硬編碼。

現在我犯了一個錯誤修正,然後提交併重建我的程序。儘管這個新版本與原來的0.1.2不同,我仍然會看到0.1.2。只有提交會告訴我它不是一樣的0.1.2。該修補程序是否值得不同的版本號?

一個解決方案是,每次進行提交時,我都會增加硬編碼的版本號(這意味着每次提交總是要修改至少2個文件)。這是一個有約束力的解決方案,當開發人員在不同的活動分支上工作時,它不起作用。如果Bob使用版本0.1.2foo功能,並且Alice使用來自相同版本的功能bar。他們如何增加版本號?鮑勃可以使用奇數和愛麗絲偶數。如果夏娃在第三個功能上工作會怎樣?

另一個解決方案是使用Git標籤自動生成版本號。腳本可以找到v開頭的最近標記,如v0.1.2,並使用標記名稱作爲版本號加上當前提交的前n個數字(v0.1.2 (build 4acd21))。如果工作目錄是乾淨的,這很好。可以想象在構建號之前添加*以指示工作目錄不乾淨。這種解決方案的主要問題是,如果有人導出源,它將無法構建blerp

什麼可能的替代方案可以解決這個問題?

+1

通常情況下,你應該避免把一個版本到源文件進行查看。理想情況下,您將有一個構建過程,將版本編碼爲內部版本號。這種方式的版本是獨立於用來構建它的源碼。那麼這個過程也可以在某個地方對提交ID進行編碼,所以你總是知道什麼是源代碼。至於存儲版本號,常用的解決方案是使用標籤。這也爲您提供了一些好處,您可以通過查看標籤,輕鬆瀏覽版本庫中的版本。 – poke

+0

@poke如果您只有SCM的源代碼,您如何獲得產品中的版本號。 「blerp」的版本是什麼? – nowox

+0

通常,您發佈的內容與版本控制中的內容不完全相同。所以你可以像我描述的那樣在構建過程中應用這個版本。 – poke

回答

5

請看看git describe命令。該命令顯示最新的標籤和設置標籤後的提交數量。還可以顯示存儲庫的不潔性。

正如你所說,這個命令不會沒有git存儲庫(.git文件夾)和git安裝。但是,今天沒有git,而是安裝了所有其他工具,這幾乎是無法想象的開發人員。

2

正如你所說,版本問題通常在git中使用branchtags(如semantic versioning模式)解決。

更好的方法是使用git僅跟蹤代碼庫中的更改,忽略(使用.gitignore文件)構建文件並維護一個乾淨的存儲庫。

構建結果(預/編譯後的文件,可執行文件,分發文件,拉鍊,EXE ...)可依賴的環境變量(平臺,系統拱等)的,應在註冊表中保持獨立。

如果代碼庫非常大且難以維護,也許您應該考慮將它分成更小的組件(或git submodule)以避免開發時的交叉依賴性。

1

版本號應該由您維護,而不是由git維護。與SVN相反,您沒有在每次提交時增加修訂版本號,因此沒有辦法開箱即可將您的版本設爲背景。

+1

是的。 git名稱是來自更改的散列,並不涉及編碼*意圖*。這是一件可以釋放的東西,還是隻是一個停止的方式? Git不知道。 –

3

Alexey Kiselev and Dario 已經暗示了答案,但我會盡力詳細解釋它。

版本方案

有兩種版本方案

  1. 內部版本號:這可以在一天內(例如,版本控制號)
  2. 發佈的版本將增加許多倍:這種變化較少(例如語義版本化)

人們使用different schemes根據需要,但semantic versioning相當廣泛地使用,並由GitHub的共同創始人Tom Preston-Werner撰寫。

語義版本

語義版本如下的X.Y.Z

或多個可讀將[major].[minor].[patch]-[build/beta/rc]

例如圖案1.2.0-beta

major or X可如果在軟件的重大變化,如向後不兼容的API版本

minor or Y如果引進向後兼容的API

patch or Z一個bug修復後遞增遞增遞增。

如何使用Git實現此目的?

通過使用標籤: 標籤中的git可以用來添加版本號。

git tag -a "v1.5.0-beta" -m "version v1.5.0-beta"

增加V1.5.0-β的版本標記到您當前的git repo.Every通過附加承諾數,並承諾哈希這個標籤增加這會自動後新的提交。這可以是使用git describe命令的視圖。

v1.5.0-beta-1-g0c4f33f這裏-1-是承諾編號和0c4f33f承諾的散列的縮寫。 g前綴代表"git"

完整的詳細信息可以通過

git show v1.0.5-beta