2016-04-26 12 views
1

我遇到以下情況:如何正確處理Subversion血統問題時合併和「忽略祖先」只會讓事情變得更糟?

F deleted  F added 
    +-----X------------X--------+-- 
^      ^| 
    |  Branch A   | | 
    |       | | 
    |       | v 
+-+----------------------+----+-+-------+-> 
         |    | 
         | Branch B | PROBLEM 
         |    v 
         +----------------> 

Branch A創建關閉行李箱。在那個分支中,Folder F被刪除,然後在稍後重新添加多個提交,但使用新的新文件(即沒有對delete進行反向合併撤銷)。之後,Branch B脫離了其他一些工作繼續進行的主幹。在此期間A重新融入了後備箱。

現在正在完成B我想重新集成到主幹中,但是在發生這種情況之前,我在同步主幹時遇到問題。不管我做什麼我的顛覆客戶端(TortoiseSVN)聲稱B的版本F已過時。我想這是因爲BF和主幹的F沒有共同的祖先。但是,當我嘗試使用「Ignore Ancestry」選項將中繼線的F合併到BF上時,它會繼續執行而不會出現錯誤,同時仍然使我看起來不像中繼線中的那個F。如果我嘗試整個樹幹駛入B「忽略原始信息」選擇其他的一切悲傷的一大堆發生(樹衝突無處不等)

在我的情況下,沒有修改過FB製造。

在這種情況下,如何正確處理血統問題?

回答

0

我不能重現該問題,所以一定有一些缺失。如果你能花時間,審查我以低於MVCE嘗試和比較,您的情況:

@ECHO OFF 

SET CWD=%~dp0 
SET REPO_NAME=repo 
SET REPO_PATH="%CWD%%REPO_NAME%" 
SET WC_NAME=wc 
SET WC_PATH="%CWD%%WC_NAME%" 

:: Create REPO URI (C:\path\to\repo -> file:///C:/path/to/repo, see https://stackoverflow.com/a/27817626/1698557) 
FOR /f "delims=" %%R IN (%REPO_PATH%) DO SET REPO_URL=%%~fR% 
SET REPO_URL=file:///%REPO_URL% 
SET REPO_URL=%REPO_URL:///\\=//% 
SET REPO_URL=%REPO_URL:\=/% 
SET REPO_URL="%REPO_URL%" 

:: Cleanup previous run 
RMDIR /S /Q %REPO_PATH% 
RMDIR /S /Q %WC_PATH% 

:: Create the repository 
svnadmin create %REPO_PATH% 

:: TEST STARTS HERE ---------------------------- 
svn mkdir %REPO_URL%/trunk -m "Creating trunk directory" 
svn mkdir %REPO_URL%/branches -m "Creating branches directory" 

:: Create folder "F" in trunk (revision 3) 
svn mkdir %REPO_URL%/trunk/F -m "Creating F directory in trunk" 

:: Checkout trunk 
svn checkout %REPO_URL%/trunk %WC_PATH% 

:: Add a file to "F" (revision 4) 
echo "First file version" > %WC_PATH%\F\thefile.txt 
svn add %WC_PATH%\F\thefile.txt 
svn commit %WC_PATH% -m "Creating thefile.txt in trunk/F" 

:: Create branch A (revision 5) 
svn copy %REPO_URL%/trunk %REPO_URL%/branches/A -m "Creating branch A" 

:: Delete F from Branch A (revision 6) 
svn delete %REPO_URL%/branches/A/F -m "Deleting F directory from branch A" 

:: Add F back to the branch (revision 7) 
svn mkdir %REPO_URL%/branches/A/F -m "Recreating F directory in branch A" 

:: Switch to branch A 
svn switch %REPO_URL%/branches/A %WC_PATH% 

:: Add a file with different content to "F" (revision 8) 
echo "Second file version" > %WC_PATH%\F\thefile.txt 
svn add %WC_PATH%\F\thefile.txt 
svn commit %WC_PATH% -m "Creating thefile.txt in trunk/F" 

:: Create branch B (revision 9) 
svn copy %REPO_URL%/trunk %REPO_URL%/branches/B -m "Creating branch B" 

:: Merge trunk to branch A (revision 10) 
svn update %WC_PATH% 
svn merge %REPO_URL%/trunk %WC_PATH% 
svn commit %WC_PATH% -m "Synchronizing branch A with trunk" 

:: Switch back to trunk 
svn switch %REPO_URL%/trunk %WC_PATH% 

:: Merge branch A to trunk (revision 11) 
svn merge %REPO_URL%/branches/A %WC_PATH% 
svn commit %WC_PATH% -m "Merging branch A into trunk" 

:: Switch to branch B 
svn switch %REPO_URL%/branches/B %WC_PATH% 

:: Merge trunk into branch B (revision 12) 
svn merge %REPO_URL%/trunk %WC_PATH% 
svn commit %WC_PATH% -m "Synchronizing branch B with trunk" 

的這個輸出是(我的機器上,運行SVN 1.9.3):

Committing transaction... 
Committed revision 1. 
Committing transaction... 
Committed revision 2. 
Committing transaction... 
Committed revision 3. 
A wc\F 
Checked out revision 3. 
A   wc\F\thefile.txt 
Adding   wc\F\thefile.txt 
Transmitting file data .done 
Committing transaction... 
Committed revision 4. 
Committing transaction... 
Committed revision 5. 
Committing transaction... 
Committed revision 6. 
Committing transaction... 
Committed revision 7. 
D wc\F 
A wc\F 
Updated to revision 7. 
A   wc\F\thefile.txt 
Adding   wc\F\thefile.txt 
Transmitting file data .done 
Committing transaction... 
Committed revision 8. 
Committing transaction... 
Committed revision 9. 
Updating 'wc': 
At revision 9. 
--- Recording mergeinfo for merge of r5 through r9 into 'wc': 
U wc 
Sending  wc 
Committing transaction... 
Committed revision 10. 
D wc\F 
A wc\F 
A wc\F\thefile.txt 
U wc 
Updated to revision 10. 
--- Merging r5 through r10 into 'wc': 
R wc\F 
A wc\F\thefile.txt 
--- Recording mergeinfo for merge of r5 through r10 into 'wc': 
U wc 
Sending  wc 
Replacing  wc\F 
Committing transaction... 
Committed revision 11. 
D wc\F 
A wc\F 
A wc\F\thefile.txt 
U wc 
Updated to revision 11. 
--- Merging r9 through r11 into 'wc': 
R wc\F 
A wc\F\thefile.txt 
U wc 
--- Recording mergeinfo for merge of r9 through r11 into 'wc': 
G wc 
Sending  wc 
Replacing  wc\F 
Committing transaction... 
Committed revision 12. 
+0

「F」裏面有文件嗎? 「F」的目錄/文件結構是相同的前/後刪除,但文件內容不同。 – Sanuuu

+0

看我的編輯。它似乎並不重要,因爲我的例子仍然沒有衝突。 –

+0

好的,感謝MVCE的嘗試!這令人費解。我懷疑這種情況可能是因爲我沒有看到整個情況,因爲存儲庫要複雜得多,已經存在了5年,現在已經有4,000多個版本。我會嘗試尋找其他一些問題的原因。 – Sanuuu