2014-09-22 57 views
3

我正在使用Subversion進行版本控制。防止用戶覆蓋svn中的對方工作

我經常看到提交相互覆蓋的實例。在git中,這是被阻止的,因爲如果您的本地回購已過期,則無法推送。顛覆中是否有類似的機制?

例如

  1. Bob用svn update更新他的工作副本。他繼續在幾天內對文件A進行一些更改。與此同時,Alice更新她的工作副本,並對文件A進行小改動,然後在同一天提交。

  2. 大約一天之後,Bob提交他的更改 - 這將不包括Alice對文件A的更改 - 覆蓋和刪除Alice的更改。當鮑勃作出承諾時,他沒有任何警告,沒有衝突或任何跡象表明他需要先更新,因爲回購已經改變。

  3. Bob不會故意觸摸Alice更改的任何代碼行,但是因爲他的工作副本在提交時沒有包含Alice的代碼,結果是repo只有Bob的更改,而Alice的消息已經消失。

雖然Alice和Bob都有到位的過程,這意味着他們應該使用svn更新他們提交之前,似乎(鮑勃),其SVN不強制這一點,鮑勃經常忘記。

我們該如何預防?

[編輯]感謝所有到目前爲止已經涉水的人。看起來你們都在說同一件事 - 我所描述的事情不可能發生。不幸的是,我對svn的經驗,使用不同的客戶端,以及幾年來不同版本的svn(開啓和關閉)與上面描述的完全一樣。看起來有一個基本的東西,我錯過了svn,以防止當你的工作副本不同步時提交代碼 - 發生了太多次,我相信svn可以阻止它,儘管這裏有所有答案。所以有些東西是棘手的 - 我需要找出什麼 - 有沒有人對如何描述感知效果有任何建議(沒有鮑勃有意刪除愛麗絲的代碼,然後向世界撒謊)?

PS:我是鮑勃。

+2

這是任何版本控制工具的基礎。在你的例子中,當鮑勃在幾個月後提交他的更改(已經由Alice提交同一文件)時,Bob必須得到「過期」錯誤,這將強制Bob更新工作副本。其他提交將不被允許。 – 2014-09-22 12:43:52

+0

我同意,這是一個基本要求,但svn沒有發生。我們談論的只是Bob更新和Bob提交之間的1或2次提交。 – Hippyjim 2014-09-22 12:46:41

+1

>>大約一天之後,Bob提交他的更改 - 這將不包括Alice對文件A的更改 - 覆蓋和刪除Alice的更改。「這不會發生在svn中。一種可能性是,當鮑勃更新工作副本時,艾麗絲的變化也來自他的工作副本,而鮑勃則刪除了艾麗絲的代碼。 :) – 2014-09-22 12:56:24

回答

4

儘管Bob和Alice都有一個適當的進程,這意味着他們應該在提交之前使用svn update,但是沒有技術來強制執行此操作,Bob經常忘記。

這是因爲有沒有技術,可以完全保護您不受用戶沒有注意他們在做什麼。

與此同時,Alice更新她的工作副本,並對文件A做一個小改動,然後在同一天提交。

大約一天之後,Bob提交他的更改 - 這不會包括Alice對文件A的更改 - 覆蓋和刪除Alice的更改。

鮑勃無法運行svn update,如果他改變了Alice更改的內容,將觸發Bob必須解決的衝突。如果Bob自己沒有妥善解決,是的,Alice的工作可能會丟失 - 但這是一個「人」問題,而不是技術問題。沒有軟件可以阻止Bob不正確地管理代碼衝突。

+0

「Bob不能在沒有運行svn update的情況下進行提交,並且如果他改變了Alice更改的內容,則會觸發Bob必須解決的衝突。」 - 就是這一點,鮑勃可以在不更新的情況下進行提交(無論他是否應該進行更新),鮑勃只是人,有時會犯錯誤,而鮑勃則刪除了艾麗斯剛剛寫的代碼。沒有錯誤,沒有衝突,沒有警告,只是一個很好的簡單的成功提交。我如何讓它警告他? – Hippyjim 2014-09-22 15:15:31

+1

@Hippyjim:您的方案無效。這些更改將成功通過(必需)更新進行合併,或者更改導致衝突,無論哪種方式,bob都無法提交其更改並刪除Alices更改,而無需對其進行審閱。 SVN迫使他回顧一下這些變化。如果你不同意,用你的場景寫一個小腳本。 – 2014-09-22 16:33:41

+1

不,Hippyjim,Bob不能在沒有首次更新的情況下提交,如果他對Alice修改了相同的文件。SVN不會讓他。這是一個非常基本的功能,SVN不會*錯過。 – Ben 2014-09-23 04:28:36

1

我仍然困惑你的情況。

Bob用svn update更新他的工作副本。他繼續在幾天內對文件A進行一些更改。

鮑勃更新,我們假設一個乾淨的工作副本,並更改​​文件「A」。理解。爲了說明起見,假設Bob的工作副本基於版本號100。

與此同時,Alice更新她的工作副本,並對文件A做一個小改動,然後在同一天提交。

好的,愛麗絲更新到版本100,並且改變了她。她承諾修改#101。

大約一天之後,Bob提交他的更改 - 這將不包括Alice對文件A的更改 - 覆蓋和刪除Alice的更改。當鮑勃作出承諾時,他沒有任何警告,沒有衝突或任何跡象表明他需要先更新,因爲回購已經改變。

好的,你在這裏失去了我。 Bob的工作副本基於版本100.但是,此工作目錄的最新版本將爲版本101.除非鮑勃先更新到版本101,否則鮑勃無法提交。

在你提交之前必須更新是一個巨大的笨重的線索,直接引起了開發者的注意。這是一個警告,你的道路充滿危險:其他人正在努力做同樣的事情。謹防!謹防!

在這一點上,鮑勃本應該做一個svn log看看有什麼改變以及爲什麼。也許愛麗絲正在解決鮑勃正在研究的同樣的錯誤。也許愛麗絲正在研究一個稍微不同的bug。 Bob應該能夠看到Alice在那一刻改變了文件A,甚至是她改變了哪些行。

不過,Bob需要做一個更新,Bob會看到文件A被合併,而不是簡單地更新。這是一個失落的太空機器人危險威爾羅賓遜的警告類型。

這是很難忽略的,特別是如果愛麗絲改變了鮑勃正在開發的一條線。這會導致合併衝突。這是反應堆核心過熱 - 爆炸是內在的。鮑勃可以忽略這個警告。他們在切爾諾貝利也是這樣做的。

鮑勃本來可以手動恢復愛麗絲的生產線。或者,如果需要合併,只需使用他的修訂來覆蓋Alice的更改。這不是偶然的。

沒有什麼能夠阻止Bob恢復更改。 Bob可以瀏覽整個Subversion日誌並刪除Alice的所有提交。沒有版本控制系統不會阻止用戶刪除更改。如果改變不好,你想恢復它。


也許問題是,鮑勃使得在文件A.一些非常微妙的變化也許文件是一個圖標或gif鮑勃是精心修改。鮑勃是一位藝術家。愛麗絲的改變只會導致鮑勃在做什麼的問題。

如果是這樣的話,Bob可以鎖定文件A.在Subversion中,文件鎖定通常是建議性的。但是,當Alice想要改變時,她會看到文件A被鎖定,並且Bob有鎖定。鮑勃甚至可以給出鎖定評論。

這可能是愛麗絲的表示,她必須與鮑勃密切合作才能改變。不過,如果鮑勃決定去百慕大兩週,愛麗絲可以盜取的鎖定,並仍然讓她變更。

3

[編輯]感謝所有到目前爲止已經跋涉過的人。看起來你們都在說同一件事 - 我所描述的事情不可能發生。不幸的是,我對svn的經驗,使用不同的客戶端,以及幾年來不同版本的svn(開啓和關閉)與上面描述的完全一樣。看起來有一個基本的東西,我錯過了svn,以防止當你的工作副本不同步時提交代碼 - 發生了太多次,我相信svn可以阻止它,儘管這裏有所有答案。所以有些東西是棘手的 - 我需要找出什麼 - 有沒有人對如何描述感知效果有任何建議(沒有鮑勃有意刪除愛麗絲的代碼,然後向世界撒謊)?

鮑勃/ Hippyjim,

我有這樣的情況偶爾會在我的球隊用戶,他們有同樣的問題,他們發誓,他們並沒有被工具警告。我仍然在努力探索它的底部,但我相當確信他們正在做某件事情,導致他們在不知情的情況下覆蓋更改。以下是我看到這種情況的兩種情況:

1.)Bob簽出修訂版100. Alice提交更改,修訂版101.Bob嘗試提交其更改並強制更新,但現在存在衝突。鮑勃被衝突淹沒,並犯下這些錯誤之一:

... 1.a。)在更新之前,鮑勃已經複製了他已更改文件的備份,現在將其複製回他的工作副本。

... 1.b。)Bob在他的版本中選擇合併工具中的「使用這個整個文件」,而沒有真正考慮衝突。

... 1.c。)Bob手動修改工作副本文件並手動刪除工具放入文件中的統一差異文本。

2.)Bob正在處理兩個位置的源代碼。一個位置與SVN綁定,一個位置可能不是(可能基於Web,在另一臺計算機或另一個文件夾中) - 或者它可能是不同分支/存儲庫的工作副本。有時更改是在其他位置進行的。鮑勃更新他的主要工作副本,像一個好孩子。 Bob意識到他正在對其中一個來源的文件A進行更改。他將文件複製並粘貼到他的工作副本中並提交。

無論哪種方式,這些都是培訓問題,是由不良做法造成的。

至於(1.):不理解合併和衝突解決可能導致這些情況。(2.):除非你在使用SCM時非常小心,否則複製和粘貼是一個壞主意。系統不知道您是否複製並粘貼了舊的更改,或者是否有意手動輸入了所有這些舊的更改。製作文件的副本或備份也會帶來麻煩(複製文件和創建'.bak'版本是我看到的「老派」開發人員有時會這樣做的) - 並且實際上並不是必須的,因爲SCM系統不應該是'讓你失去你的代碼。如果您無法使用工具提供的合併工具,則可以將該工具欺騙,以允許您覆蓋舊的更改。

這些是我在沒有經驗的開發人員看到的場景。即使是偉大的開發者有時也會面臨複雜的衝突解決方案

最後一個想法......您使用的是什麼SVN客戶端?我不知道有什麼會不會警告一個陳舊的工作副本(如其他評論者)。我在Linux上廣泛使用命令行SVN,在Windows上使用SlikSVN和TortoiseSVN。

+0

不錯的想法,不幸的是,這發生在沒有我知道的任何合併的情況下,而且Bob絕對只使用一個位置來存儲他的文件。當然,自從我寫這個問題以來,我一直無法重現這個問題,所以很難跟進。我會留意你提到的第一種情況,因爲它看起來似乎更像這兩種情況。 – Hippyjim 2014-11-25 11:24:20