svn 演化樹怎麼看 - 為什麼我在Subversion中發生樹衝突?




phylogenetic中文 outgroup中文 (10)

這裡發生的事情如下:你在你的trunk上創建一個新文件,然後將它合併到你的分支中。 在合併提交中,該文件也將在您的分支中創建。

當你將你的分支合併到主乾時,SVN會再次嘗試這樣做:它會在你的分支中看到一個文件被創建,並且嘗試在合併提交中的trunk中創建它,但它已經存在! 這會產生樹衝突。

避免這種情況的方法是做一個特殊的合併和重新整合 。 您可以使用--reintegrate開關實現此--reintegrate

您可以在文檔中閱讀以下內容: http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate : http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate

然而,當你的分支合併到樹乾時,底層數學是完全不同的。 您的功能分支現在是重複中繼線更改和專用分支更改的混雜模式,因此沒有簡單的連續範圍的修訂即可複制。 通過指定--reintegrate選項,您可以要求Subversion仔細複製您的分支獨有的更改。 (事實上,它通過比較最新的樹形樹和最新的樹形樹來實現這一點:所得到的差異正是您的樹枝改變!)

重新集成分支之後,強烈建議將其刪除,否則無論何時在其他方向合併時都會收到樹衝突:從樹幹到分支。 (與前面描述的原因完全相同)。

有一種解決方法,但我從來沒有嘗試過。 你可以在這篇文章中閱讀它: v1.6中的Subversion分支重新集成

我有一個我的樹幹功能分支,並正在將我的樹幹變化週期性地合併到我的分支中,並且一切正常。 今天,我將分支合併回主幹,並且在創建分支後添加到我的主幹中的任何文件都被標記為“樹衝突”。 未來有沒有辦法避免這種情況?

我不認為這些被正確標記。


我偶爾遇到的情景:

假設你有一個主幹,從中創建了一個發布分支。 在trunk上進行了一些更改(尤其是創建“some-dir”目錄)之後,您將創建一個功能/修復分支,以便稍後將其合併到發布分支中(因為更改足夠小,功能/修復對發布很重要) 。

trunk -- ... -- create "some-dir" -- ...
     \                                  \-feature/fix branch
      \- release branch

如果您嘗試直接將功能/修復分支合併到發布分支中,則會發生樹衝突(即使該功能/修復分支中不存在該目錄):

svn status
!     C some-dir
      >   local missing or deleted or moved away, incoming file edit upon merge

因此,在合併特性/修復分支之前,需要明確地合併在trunk上創建的提交,然後創建創建“some-dir”目錄的特性/修復分支。

我經常忘記,因為這在git中不是必需的。


這可能是由於不使用相同版本的客戶端而導致的。

將版本1.5客戶端和版本1.6客戶端用於相同的存儲庫可能會導致此類問題。 (我只是咬了自己。)


我有類似的問題。 實際上我唯一能做的就是用下面的方法刪除衝突的子目錄:

svn delete --force ./SUB_DIR_NAME

然後從工作副本中的另一個根目錄中再次復制它們,其中包含:

svn copy ROOT_DIR_NAME/SUB_DIR_NAME

然後做

svn cleanup

svn add *

您可能會收到最後一條警告,但只是忽略它們,最後

svn ci .

Subversion 1.6添加了樹衝突以涵蓋目錄級別的衝突。 一個很好的例子是當你在本地刪除一個文件,然後一個更新嘗試在文件上改變文本。 另一個是當你有一個顛覆的重命名你正在編輯的文件,因為這是一個添加/刪除操作。

CollabNet的Subversion博客有一篇關於樹衝突的文章。


根據我的經驗,SVN會在我刪除一個文件夾時創建樹衝突。 似乎沒有理由。

我是唯一一個處理我的代碼 - >刪除目錄 - >提交 - >衝突!

我迫不及待地想切換到Git

我應該澄清 - 我使用Subclipse 。 這可能是問題! 再次,我迫不及待地想切換......


我今天也遇到過這個問題,雖然我的問題可能與您的問題無關。 在檢查完文件列表後,我意識到我做了什麼 - 我暫時從另一個程序集的一個程序集中使用了一個文件。 我做了很多修改,並不想孤兒SVN的歷史,所以在我的分支中,我已經將文件從另一個程序集的文件夾中移出。 這不會被SVN跟踪,所以它看起來像文件被刪除然後重新添加。 這最終導致樹衝突。

我解決了問題,將文件移回,提交, 然後合併我的分支。 之後我將文件移回。 :)這似乎有伎倆。


我發現解決方案閱讀了加里給出的鏈接(我建議按照這種方式)。

總結一下解決SVN客戶端1.6.x的工作目錄樹衝突問題,你可以使用:

svn resolve --accept working -R .

哪裡. 是衝突的目錄。

警告“提交工作目錄”意味著你的沙箱結構將是你正在提交的沙箱結構,因此,例如,如果你從沙箱中刪除了一些文件,它們也將從存儲庫中刪除。 這僅適用於衝突的目錄。

這樣,我們建議SVN解決衝突( --resolve ),從當前目錄( . )開始遞歸地( -R )接受沙箱內的工作副本( --accept working )。

在TortoiseSVN中,右鍵單擊選擇“已解決”,實際上可以解決此問題。


如果遇到因為沒有編輯/刪除/來到文件附近的任何地方而無意義的樹衝突,那麼合併命令中出現錯誤的可能性也很大。

可能發生的情況是,您之前已經合併了您在當前合併中包含的一系列更改。 例如,在後備人員編輯一個文件,然後重命名它。 如果在第一次合併時包含編輯,然後在第二次合併中包含編輯和重命名(實質上是刪除),它也會給你一個樹衝突。 原因是之前合併的編輯會顯示為您自己的,因此刪除將不會自動執行。

至少可以在1.4版本庫上發生,我不確定1.5版本中引入的合併跟踪是否有幫助。


如果你使用的是TortoiseSVN,你可以試試這個,如果你願意看項目項目 - 適用於我:

  1. 在存儲庫頂級URL下創建一個空白項目,並將其命名為BLANK
  2. 點擊左側窗格上的回購網址
  3. 在右側窗格中選擇你的BLANK項目和你想要的項目 - 比如樹幹
  4. 右鍵點擊彈出瀏覽器菜單並選擇“比較URL”,具體取決於您的回購大小,可能需要一分鐘才能加載。 但是你基本上把你的整個項目列表放在一個“準備搜索”列表中。
  5. 在搜索過濾器中輸入您的文件名或其他字符串




svn merge tree-conflict