2009-10-13 17 views
11

這種情況是我花了一些時間搞亂一些實驗性代碼。我現在想將部分代碼 - 大約500行 - 移動到另一個文件中,但我不想丟失歷史記錄,就像我做一個簡單的文本編輯器剪切和粘貼一樣。使用Subversion,我怎樣才能從一個文件剪切並粘貼到另一個保存歷史

就像我知道如何將代碼從原始文件中分離出來 - svn copy,然後從兩個副本中刪除不需要的東西。但我不知道如何將該部分副本附加到現有文件上,並保留兩者的歷史記錄。

這個很重要的原因基本上是代碼只是很專業的東西,以幫助實現一些更高級別的功能。我不希望它污染全局名稱空間,所以我希望它在一個文件中被使用幷包裝在一個匿名名稱空間中。

我意識到這聽起來像合併一個分支回樹幹。事情是,沒有分支。實驗代碼並不是以任何東西的副本開始的 - 這只是一堆從頭開始的代碼。我想要剪切的文件和我想要粘貼的文件是完全獨立的文件。

我大多使用TortoiseSVN,但也安裝了命令行subversion。

回答

16

您可以合併一個文件的所有版本(或者特定版本)到另一個像這樣

svn merge sourcefile targetfile -r 0:HEAD 

起初我以爲一個人必須要使用--ignore-ancestry選項(因爲這兩個文件不共享任何常見歷史),但顯然這不是必要的。我用svn 1.6.3進行了測試。

您當然很可能會在合併結果中獲得大量衝突標記。手工合併可能更容易(如你所說的複製和粘貼合併),然後運行上述合併命令--record-only來告訴它的顛覆。

合併之後,targetfile將具有svn:mergeinfo屬性,該屬性指示從哪個提交合併到sourcefile。當您檢查targetfile的日誌時,可以使用--use-merge-history選項查看這兩個文件的歷史記錄。 TortoiseSVN以日誌形式的複選框的形式具有相同的功能。

+0

這很聰明。 – 2009-10-13 15:46:30

+0

我懷疑這不會完全符合我的要求,但我相信這是我將獲得的最好結果(缺少svn dump hacking),所以我接受。謝謝。 – Steve314 2009-10-13 16:59:40

+0

您將擁有提交日誌,但您所做的更改中的所有行在「責任」中都有相同的修訂標記。 – 2009-10-14 15:27:57

1

如果你想在一個新的文件複製和刪除舊文件:

svn mv 

如果你想在一個新的文件複製:

svn copy 

如果這兩個文件已存在:

# copy/paste with a text editor 

您可以刪除一個文件並保留其歷史記錄:

svn del 

使用SVN,您無法保留兩個文件合併的歷史記錄。 您可以手動合併它並在提交消息中保留跟蹤。

+0

這些都不給我包含來自兩個源文件的文件文本(歷史)。文本編輯器複製/粘貼保留了存儲庫中的兩個歷史記錄,true - 任何內容都不會被刪除 - 但是您從中刪除的文件的歷史記錄將從您粘貼的文件中分離出來。在TortoiseSVN術語中,責備將所有內容歸咎於剪貼畫,而不是對作出編碼決定的人進行責備。 – Steve314 2009-10-13 00:53:39

+0

它是Subversion給你的所有工具。你應該使用一些DVCS。 TortoiseMercurial適用於Windows用戶。 – Natim 2009-10-13 01:06:24

+0

順便說一句,我不明白你期望合併兩個文件的歷史。它沒有任何意義。你有什麼樣的回滾?您可以在文件的開始處添加註釋,以表示它是合併此文件與修訂版中的另一個文件rXXXX – Natim 2009-10-13 01:08:34

4

我不認爲你可以用你描述的方式保存歷史。 SVN會逐個文件地跟蹤歷史記錄,並且不會跟蹤在同一代碼行上組合在一起的兩個單獨文件。

如果您從兩個單獨的文件開始,然後將它們組合成第三個文件,那麼兩者的歷史記錄將保留。如果將一個人與另一個人結合起來,那麼他們中的一個人的歷史將會「失去」,因爲僅僅通過查看歷史,您將無法鏈接回「已刪除」文件的歷史記錄。

我想你可以做的是在提交消息中,只需注意來自其他文件的內容被合併,然後在同一提交中提交刪除。

+0

我有一種感覺,那就是答案。在機會不被接受的情況下 - 明天我會再看一次以防萬一。 – Steve314 2009-10-13 01:31:40

-1

你不能把代碼保留在它自己的文件中(在修剪你不想保留的部分之後),並將這個文件包含到你的「真實」源文件中嗎?

// file foo.cpp: 
... 
namespace { 
# include "util_code.inc" 
} 

不是真的正宗,但應該工作...

+0

我不喜歡那種#include使用的風格。習慣了這種規範,很久以前就是其他語言中的身體慣例。這可能就是爲什麼這個想法甚至不會發生在我身上 - 但是,考慮到一系列不完美的選擇,我認爲這並不壞。這一次太遲了 - 但總是會有下一次。 – Steve314 2009-10-15 08:58:25

+0

謝謝。我當然不會推薦一般使用這種#include指令。但我沒有用它們來包括生成的代碼: 的#define MyClass的the_class的的#include method_bodies.inc 與method_bodies.inc看起來像這樣: 無效:: the_class的generatedMethod(){ ... } 因此,我能夠在沒有生成器知道類名的情況下生成一些類但不是全部的方法。 – 2009-10-15 09:23:29

相關問題