2011-06-15 149 views
7

我正在尋找將git分支轉換爲git標籤的最佳和最安全的方法。當我手動移植一個svn版本庫時,我基本上覆制了所有的分支機構,並且我們爲每個次要版本(1.1,1.2,1.3)都有一個分支,儘管這樣做可能不是最好的方式,但是爲了速度,當時我比標籤更適合分支。我現在有分支機構1.5,1.6,1.7,1.8,但是由於我們在任何時候都只部署了1個版本的代碼,我可能只需要最後一個版本就可以成爲分支機構,被部署。所以我正在尋找將git分支轉換爲git標籤的最佳方式。我想我有辦法但確定它有多好。將git分支轉換爲git標籤

我迄今所做的是爲每個分支我要轉換爲一個標籤,我已經檢查,以確保沒有在那些不在主支支沒有提交,所以我所做的:

git log 1.5 ^master 
git log 1.6 ^master 
git log 1.7 ^master 

所有這些都沒有給我帶來什麼,我相信這意味着這些分支中的所有提交都存在於主設備中。我這樣做是因爲我假定在那些不在master的分支中有提交,當將分支轉換爲標籤時,我會失去它們,因爲標籤只是一個提交而不是開發線的「指針」。與似乎不錯,我的假設是,我只想要做:

git tag 1.5v 1.5 
git tag 1.6v 1.6 
git tag 1.7v 1.7 

那我就只需要刪除本地的分支機構,推動這些變化給遠程倉庫。這是將git分支轉換爲git標籤的最佳方式嗎?

我還有一個問題是,如果有人從1.7中創建了一個分支(這是沒有人應該做的),並且他們拉取了刪除該分支的更改,他們是否能夠將這些更改合併到另一個分支(如master)或者那種破壞他們創建的分支?這是一個不應該發生的情況,因爲除了最後一個版本之外,不應該創建任何人的分支版本(在本例中爲1.8),但人們並不總是遵循程序,所以我想確保有一種方法要解決這個問題,如果發生了。

+0

[這裏我描述了一種將SVN標籤分支轉換爲git標籤的有效方法(http://stackoverflow.com/a/20807602/815781) – Onlyjob 2013-12-27 20:54:17

回答

6

簡短回答:這不是問題。儘管我建議您使用-m選項來創建帶註釋的帶註釋的標籤(請參閱man git-tag),因爲這會創建一個「第一類」標籤,git describe等將使用此標籤額外的參數。

長答案: 遠程分支機構不會直接影響本地分支機構。如果我從分支中創建分支或從公共回購中創建標籤,那麼當您刪除該分支並獲取回購時,我會看到您的分支已經消失,但我的分支在我的回購中仍然完整。

當您提交HEAD和您正在處理的分支指向新提交時,Brances只是git倉庫中提交的符號名稱。標籤也是一個提交的符號名稱,但是這是不可改變的(雖然你可以刪除它但不能改變),所以它指向歷史中的一個固定位置,而分支指向移動的頭部歷史上的一條線。由於git中的提交有零個,一個或多個父提交(初始提交爲零,一個用於正常提交,多於一個用於合併),即使原始分支或標記從遠程刪除,您的本地回購仍然有一個指向你本地分支的指針,從這裏你可以找到一個共同的祖先(假設分支首先相關),所以你仍然可以將任何分支的變化合併到主分支中。

從svn到git起初可能有點混亂。聽起來好像你還在用svn術語思考,讓一切變得更加混亂。如果你把git看作高級文件系統(這就是Linus Torvalds編寫它時),而不是源代碼控制工具,我認爲它更容易。我還建議你花一些時間閱讀(或瀏覽)git for computer scientists,這聽起來並不令人望而生畏;並且更好地理解其實際工作方式將有助於您思考「正確的方式」。 ;)

3

據我所知,你想創建標籤而不是分支,從而防止他人繼續在這些分支上提交。

不幸的是,你無法阻止人們從他們想要的地方創建分支,特別是因爲Git是一個分散的VCS。但是,您可以決定是否可以將提交推送到中央存儲庫。所以你可以編寫鉤子來禁止在祖先中有特定提交的提交。