2008-09-21 35 views
7

如果我們的組織要從一個像Subversion這樣的中央服務器VCS切換到像git這樣的分佈式VCS,我該如何確保我的所有代碼都可以避免硬件故障?如何確保我的git回購代碼安全?

對於中央服務器VCS,我只需要每天備份存儲庫。如果我們使用的是DVCS,那麼在所有開發人員機器上都會有大量代碼分支,並且如果該硬件出現故障(或者開發人員會丟失筆記本電腦或者它被盜),那麼我們就不會有任何備份。

請注意,我不認爲這是一個很好的選擇,「讓開發人員推送分支機構到服務器」 - 這是tedious和開發人員最終不會這樣做。

是否有解決此問題的常用方法?

一些澄清:

隨着本地中央服務器的VCS然後一切必須是除了開發商的最新變化在中央服務器上。因此,例如,如果開發人員決定分支執行錯誤修復,則該分支位於中央服務器上,並可立即進行備份。

如果我們使用DVCS,那麼開發人員可以做一個本地分支(實際上還有許多本地分支)。這些分支機構都不在中央服務器上,只有在開發人員認爲「哦,是的,我應該將其推送到中央服務器」時纔可用於備份。

所以我看到的差異(糾正我,如果我錯了!):半實施的功能和錯誤修正可能不適用於中央服務器上的備份,如果我們使用DVCS,但與一個正常的VCS。我如何保持代碼安全?

回答

12

我認爲你會發現在實踐中開發人員更喜歡使用中央存儲庫,而不是在彼此的本地存儲庫之間進行推拉。一旦你克隆了一箇中央倉庫,在處理任何跟蹤分支時,獲取和推送都是簡單的命令。向所有同事的本地存儲庫添加六七個遠程控制檯是一件痛苦的事情,這些存儲庫可能並不總是可以訪問的(關掉電腦,在家裏拿一臺筆記本電腦等)。

在某些時候,如果你們都在同一個項目上工作,所有的工作都需要整合。這意味着您需要一個集成分支,將所有更改集中在一起。這自然需要在所有開發人員都可以訪問的地方,例如,它不屬於主要開發人員的筆記本電腦。

一旦建立了中央存儲庫,您就可以使用cvs/svn樣式工作流來檢入和更新。如果你有局部更改,cvs update會變成git fetch和rebase,或者如果你沒有git pull, cvs commit成爲git commit和git push。

通過此設置,您與完全集中的VCS系統處於類似的位置。一旦開發人員提交他們需要做的更改(git push),以便其他團隊可以看到,他們將在中央服務器上進行備份。

在這兩種情況下需要遵守規定的是防止開發人員長時間將更改保留在中央存儲庫之外。我們大多數人可能在一個開發人員正在研究特性「x」的情況下工作,這需要對某些核心代碼進行根本性改變。這種改變將導致其他人需要完全重建,但該功能還沒有準備好主流,所以他只是保持檢查,直到適當的時間點。

儘管存在一些實際差異,但兩種情況的情況非常相似。使用git,因爲你可以執行本地提交併可以管理本地歷史記錄,所以對個人開發人員而言,推送到中央存儲庫的需求可能不會像使用cvs那樣感受到。

另一方面,可以使用本地提交作爲優勢。將所有本地提交推送到中央存儲庫上的安全位置應該不是很困難。本地分支可以存儲在開發人員特定的標籤名稱空間中。

例如,對於Joe Bloggs,可以在他的本地存儲庫中製作別名以響應(例如)git mybackup執行類似於以下的操作。

git push origin +refs/heads/*:refs/jbloggs/* 

這是一個可以在任何時候(如一天結束)一起使用,以確保他的所有本地更改都安全地備份一個命令。

這有助於各種災難。喬的機器爆炸了,他可以使用另一臺機器取回已保存的提交併繼續從他離開的地方繼續。喬生病了?弗雷德可以讓喬的分支去抓住他昨天做出的'必須有的'修正,但是沒有機會對主人進行測試。

回到原來的問題。 dVCS和集中式VCS之間是否需要有所區別?你說半實現的功能和錯誤修正不會在dVCS案例中的中央存儲庫上結束,但我會爭辯說不需要任何區別。

我已經看到很多情況下,使用集中式VCS時,半實施功能停留在一個開發人員工作箱上。它要麼採取允許將一半書面特徵檢入主流的策略,要麼決定創建一箇中央分支。

在dVCS中可能發生同樣的事情,但應該做出同樣的決定。如果有重要但不完整的工作,則需要集中保存。 git的優勢在於創建這個中心分支幾乎是微不足道的。

1

使用「中央」服務器作爲DVCS中的權限並不少見,它也爲您提供備份的位置。

0

您可以讓開發人員主目錄通過本地網絡安裝遠程設備。那麼你只需要擔心網絡存儲安全。或者,也許你可以使用像DropBox這樣的東西無縫地複製你的本地回購。

+0

主目錄通過本地網絡掛載遠程設備
我們之前已經嘗試過,而且由於網絡延遲,通常會造成災難性後果。那對於備份磁帶來說意味着更多的東西。 – 2008-09-21 06:16:38

3

我認爲這是一個謬論,使用分佈式VCS必然意味着您必須必須以完全分佈式的方式使用它。建立一個通用的git倉庫並告訴每個人倉庫是官方倉庫是完全有效的。對於正常的開發工作流程,開發人員可以從公共存儲庫中獲取更改並更新其自己的存儲庫。只有在兩個開發人員積極協作才能實現特定功能的情況下,他們可能需要直接從對方獲取更改。

由於有不少開發人員在從事項目工作,因此必須記住要從其他人那裏獲取更改。如果沒有有中央存儲庫,你會怎麼做?

在工作中,我們有一個備份解決方案,每天備份每個人的工作目錄,並將整批文寫入DVD每週。因此,儘管我們有一箇中央存儲庫,但每個存儲庫也都備份。

+0

格雷格 - 我已經澄清了這個問題,強調我正在談論半實現功能/ bug分支。 VCS或DVCS無論如何都需要成爲發佈等的中央服務器。 – 2008-09-21 06:44:03

0

您團隊中的所有開發人員也可以在服務器上擁有自己的分支機構(可以是門票或只是每個開發人員等)。這樣他們不會破壞master分支中的構建,但他們仍然可以將他們的工作推進到備份的服務器中。

My own git_remote_branch工具可能適用於那種工作流程(請注意,它需要Ruby)。它有助於操縱遠程分支機構。

作爲一個便箋,談論回購安全性,在您的服務器上,您可以設置一個post-commit鉤子來執行簡單的git克隆或git推送到另一臺計算機......您可以在每個備份之後獲得最新的備份承諾!

0

我們使用rsync將各個開發者.git目錄備份到服務器上的目錄中。這是使用圍繞git clone的包裝腳本以及post-commit等鉤子來設置的。

因爲它是在post-hook中完成的,所以開發人員不需要記住手動完成它。而且由於我們使用超時的rsync,如果服務器關閉或用戶正在遠程工作,它們仍可以工作。

1

我覺得這個問題有點奇怪。假設您使用的是非分佈式版本控制系統(如CVS),那麼您將在中央服務器上擁有一個存儲庫,並在開發人員的服務器上進行工作。你如何備份存儲庫?你如何備份開發者正在進行的工作?這些問題的答案正是你必須做的處理你的問題。

使用分佈式版本控制,開發人員的服務器上的存儲庫只是在進行中。你想支持它嗎?然後支持它!就這麼簡單。

我們有一個自動備份系統,可以抓取我們指定的機器上的任何目錄,因此我在機器上添加了任何存儲庫和工作副本,包括git和CVS存儲庫。順便說一下,如果你在公司發佈產品時使用分佈式版本控制,那麼你有一箇中央存儲庫。這是你釋放的人。它可能不在特殊的服務器上;它可能在某些開發人員的硬盤上。但是您發佈的存儲庫是中央存儲庫。 (我想如果你還沒有發佈,但是你可能還沒有發佈。)我覺得所有的項目都有一個或者多箇中央倉庫。 (如果他們有不止一個,這是兩個項目,一個是分叉。)這也適用於開源。

即使您沒有中央存儲庫,解決方案也是一樣的:備份開發人員的機器上的工作。無論如何,你應該一直這樣做。正在進行的工作在分佈式存儲庫而不是CVS工作副本或直接非版本化目錄中的事實並不重要。

+0

我們不支持開發人員工作站(當你有100人時,它很昂貴),並鼓勵他們每天檢查幾次。然後我們只需要備份服務器。這不是git的選項。 – 2009-03-30 23:17:58