2008-10-09 117 views
25

我有以下問題使用subversion:Subversion沒有將更改合併到重命名的文件中?

我目前正在研究我的項目的主幹,並計劃做一些重構(其中包括重命名文件或移動文件到不同的目錄)。

與此同時,別人正在分支上的同一個項目上工作。

有時候我想合併在分支上所做的更改回幹線。這包括對在中繼上重命名的文件(在分支上)所做的更改。

我做了一些測試,似乎顛覆不能跟蹤這些變化,或者我錯過了someting(這是我所希望的)。我測試了這個使用下面的腳本(應該在bash工作,假定有一個SVN倉庫處的「http://myserver/svn/sandbox」):

svn co http://myserver/svn/sandbox 

cd sandbox/ 

mkdir -p MyProject/trunk MyProject/branches MyProject/tags 

cat - <<EOF >MyProject/trunk/FileOne.txt 
Test 
1 
2 
EOF 

svn add MyProject 

svn commit -m "init" 

# create a branch 
svn copy http://myserver/svn/sandbox/MyProject/trunk http://myserver/svn/sandbox/MyProject/branches/Branch_1 svn copy http://myserver/svn/sandbox/MyProject/trunk http://myserver/svn/sandbox/MyProject/branches/Branch_1 

# rename the file 
svn move MyProject/trunk/FileOne.txt MyProject/trunk/FileTwo.txt 

svn commit -m "renamed file" 

svn update 

# change the content of FileOne in branch 

cat - <<EOF >MyProject/branches/Branch_1/FileOne.txt 
Test 
2 
3 
EOF 

svn commit -m "changed branch" 

# I now try to merge the changes in FileOne back to FileTwo 
cd MyProject/trunk/ 
svn merge -r1:HEAD http://myserver/svn/sandbox/MyProject/branches/Branch_1 
# but this yields the following message: 
# Skipped missing target: 'FileOne.txt' 

任何幫助是極大的讚賞。

編輯: 也許由mikegrb建議的過程可以通過自動稍微通過首先產生地圖上從SVN log命令在樹幹上重命名的文件(OLD->新):

svn log -v 
------------------------------------------------------------------------ 
r33 | sme | 2008-10-09 15:17:54 +0200 (Do, 09 Okt 2008) | 1 line 
Changed paths: 
    D /MyProject/trunk/FileOne.txt 
    A /MyProject/trunk/FileTwo.txt (from /MyProject/trunk/FileOne.txt:31) 


resulting map: {FileOne.txt => FileTwo.txt} 

現在使用這個映射到在分支上生成的補丁文件中更改文件名。

原文:

Index: FileOne.txt 
=================================================================== 
--- FileOne.txt (.../trunk)  (revision 31) 
+++ FileOne.txt (.../branches/Branch_1) (revision 34) 
@@ -1,3 +1,3 @@ 
Test 
-1 
2 
+3 

修改:

Index: FileTwo.txt 
=================================================================== 
--- FileTwo.txt (.../trunk)  (revision 31) 
+++ FileTwo.txt (.../branches/Branch_1) (revision 34) 
@@ -1,3 +1,3 @@ 
Test 
-1 
2 
+3 

只是一個想法,還沒有做呢。

回答

22

我覺得這是一個現有的顛覆bug - 但不要屏住呼吸,自2002年以來

+2

看起來他們把這個bug推到了1.8版。這只是說'還沒有'的另一種方式。自從2002年開放以來,它開始越來越像「沒有」過。 – 2009-06-18 00:34:57

1

很可能您必須在分支中重命名它們。你可以合併將它們從trunk重命名爲分支的修訂版本嗎?這可能會節省一些時間。否則,你將不得不在分支中重命名它們。然後嘗試合併回到主幹。

11

不幸的是,這是顛覆的侷限之一。當我們最近有類似的情況來處理我們的解決方案時,爲分支創建一個巨大的差異,然後通過文件手動修補中繼來通過它。已重命名且未找到的文件將導致修補程序提示輸入文件名進行修補。非常次優。注意二進制文件不會在diff中顯示。這是促使我們評估其他版本控制系統並最終決定轉換到git的重要因素之一。

+4

技術上Git沒有真正的重命名支持。但是他們確實會進行猜測,這比SVN更好。 Bazaar是唯一支持真正重命名的開源VCS。 – 2009-06-18 00:32:49

1

一種解決方法是與分支同步主幹前同步與主幹分支它一直開着。

不同之處在於,主幹分支有一個文件來應用更改(移動)到,而分支到主幹沒有文件來應用更改(修改)。這很簡單,因爲SVN似乎沒有跟蹤文件被移動/重命名的位置。我不知道爲什麼它不會,希望有一個很好的理由。

實施例:

  • 轉1:/trunk/foo.txt移動到/trunk/folder/foo.txt
  • REV 2:/branches/mybranch/foo.txt被修改

如何將foo.txt更改合併到trunk?

解決方案:

  1. 合併從主幹的所有修訂mybranch和承諾。這將導致foo.txt移動。
  2. 將mybranch的所有修訂合併到中繼。這將更新foo.txt的內容,因爲它們現在具有相同的路徑。

注意:如果您已經在trunk和mybranch上移動/重命名了不同的文件,那麼您需要搭便車。我想你將不得不在變化中有選擇地合併,以便在兩個方向上先移動/重命名,然後合併更改。

相關問題