【问题标题】:SVN how to resolve "local add, incoming add upon update" on a *folder*?SVN如何解决*文件夹*上的“本地添加,更新时传入添加”?
【发布时间】:2011-04-28 11:34:38
【问题描述】:

这是我的场景:

假设我们有一个包含以下内容的 SVN 存储库: 我的文件夹 我的文件夹\file.txt

现在我为这个 repo 创建两个结帐,co1 和 co2。

在 co1 中我们修改 file.txt。 在二氧化碳中,我们:

  • svn 删除我的文件夹
  • svn 提交
  • 创建一个名为 myfolder 的新文件夹
  • svn 添加我的文件夹
  • svn 提交

现在如果我尝试在 co1 中进行更新,我会遇到树冲突:

A  +  C myfolder >   local edit, incoming delete upon update
M  +    myfolder\file.txt

我想保留我的文件夹和修改后的文件,所以我解决了树冲突:

svn resolve --accept working folder

现在,如果我尝试提交,我会得到“svn: Directory '/myfolder' is out of date”。如果我尝试使用 svn up myfolder 解决此问题,我会再次遇到树冲突:

A  +  C folder >   local add, incoming add upon update
M  +    myfolder\file.txt

好的,所以我们再次尝试 svn resolve --accept 工作文件夹。但是我们仍然无法提交,我们得到相同的消息“svn: Directory '/myfolder' is out of date”,如果我们执行 svn up myfolder,我们会直接回到最后的树冲突。

解决此类冲突的正确程序是什么(当我们希望保留 myfolder 及其更改时)?

编辑:Windows cmd 行脚本来说明:

rmdir /S /Q C:\svntest 
mkdir C:\svntest

cd C:\svntest

svnadmin create repo

svn co file:///c:/svntest/repo co1
svn co file:///c:/svntest/repo co2

cd co1
mkdir folder
echo content > folder\file.txt
svn add folder
svn commit folder -m ""

cd C:\svntest\co2
svn up

cd C:\svntest\co1
svn del folder
svn commit -m ""
mkdir folder
svn add folder
svn commit -m ""

cd C:\svntest\co2
echo changed_content > folder\file.txt
svn up
svn resolve --accept working folder
svn commit -m ""

svn up folder
svn resolve --accept working folder
svn commit -m ""

这是运行该脚本的输出(注意最后的提交失败):

C:\>rmdir /S /Q C:\svntest  

C:\>mkdir C:\svntest 

C:\>cd C:\svntest 

C:\svntest>svnadmin create repo 

C:\svntest>svn co file:///c:/svntest/repo co1 
Checked out revision 0.

C:\svntest>svn co file:///c:/svntest/repo co2 
Checked out revision 0.

C:\svntest>cd co1 

C:\svntest\co1>mkdir folder 

C:\svntest\co1>echo content  1>folder\file.txt 

C:\svntest\co1>svn add folder 
A         folder
A         folder\file.txt

C:\svntest\co1>svn commit folder -m "" 
Adding         folder
Adding         folder\file.txt
Transmitting file data .
Committed revision 1.

C:\svntest\co1>cd C:\svntest\co2 

C:\svntest\co2>svn up 
A    folder
A    folder\file.txt
Updated to revision 1.

C:\svntest\co2>cd C:\svntest\co1 

C:\svntest\co1>svn del folder 
D         folder\file.txt
D         folder

C:\svntest\co1>svn commit -m "" 
Deleting       folder

Committed revision 2.

C:\svntest\co1>mkdir folder 

C:\svntest\co1>svn add folder 
A         folder

C:\svntest\co1>svn commit -m "" 
Adding         folder

Committed revision 3.

C:\svntest\co1>cd C:\svntest\co2 

C:\svntest\co2>echo changed_content  1>folder\file.txt 

C:\svntest\co2>svn up 
C folder
At revision 3.
Summary of conflicts:
  Tree conflicts: 1

C:\svntest\co2>svn resolve --accept working folder 
Resolved conflicted state of 'folder'

C:\svntest\co2>svn commit -m "" 
Adding         folder
svn: Commit failed (details follow):
svn: Directory '/folder' is out of date

C:\svntest\co2>svn up folder 
   C folder
At revision 3.
Summary of conflicts:
  Tree conflicts: 1

C:\svntest\co2>svn resolve --accept working folder 
Resolved conflicted state of 'folder'

C:\svntest\co2>svn commit -m "" 
Adding         folder
svn: Commit failed (details follow):
svn: Directory '/folder' is out of date

【问题讨论】:

  • @Azirath:我更新了我的答案,你能告诉我你使用的是什么版本的 svn 吗?
  • 抱歉回复时间过长,我不得不将这个未注册的账户与我的真实账户合并。在 cmets 中查看我对您的回答的回答。

标签: svn tree-conflict


【解决方案1】:

我想通了

svn resolve --accept working  PATH_TO_FILE

最终应该是:

解决了“PATH_TO_FILE”的冲突状态

【讨论】:

【解决方案2】:

试试

C:\svntest\co2>move folder folder.SAVE
C:\svntest\co2>svn revert folder
C:\svntest\co2>svn update

然后Svn 应该引入一个新的folder 目录版本,与co1 中的目录版本相同。然后您可以使用来自folder.SAVE 的内容进行覆盖。

【讨论】:

    【解决方案3】:

    在这种特殊情况下,我认为您必须手动重新应用本地更改。也就是说,创建一个补丁文件(svn diff > mine.patch,或将文件复制到其他地方),恢复您的更改或使用他们的解决方案,然后应用补丁(或将文件复制回来)。在应用更改之前,您可能需要将文件的基础复制回重新创建的文件夹中。

    就像 zellus 所说,这是颠覆的阴暗面,这是当前实现无法处理的。再说一次,删除一个文件夹并添加一个同名的文件夹听起来不太正确。你希望颠覆会做什么?如果文件没有在文件夹中重新创建怎么办?如果内容不一样呢?

    尝试通过不删除要保留的文件夹来完全避免这种情况:)

    【讨论】:

    • 如前所述,我们在使用 SVN(通过 SharpSVN)作为共享用户数据的内部版本控制系统的应用程序中遇到了这个问题。在我们的场景中,删除文件夹的不是同一用户,而是服务器端删除导致下一个更新的客户端重新创建文件夹。我只是希望 SVN 给我一种方法来指定我的工作副本的当前内容已与服务器上的给定修订版合并,从而允许我提交结果。
    【解决方案4】:

    我无法重现您提到的内容。这是我尝试过的。

    test@test:/tmp$ cd /tmp/ 
    test@test:/tmp$ svn co http://localhost:8080/svn/stackoverflow so --username=admin
    A    so/trunk
    A    so/branches
    A    so/tags
    Checked out revision 1.
    test@test:/tmp$ cd so/trunk/ 
    test@test:/tmp/so/trunk$ mkdir x 
    test@test:/tmp/so/trunk$ ls /tmp > x/test.txt 
    test@test:/tmp/so/trunk$ svn add x/ 
    A         x
    A         x/test.txt
    test@test:/tmp/so/trunk$ svn ci -m "test"
    Adding         trunk/x
    Adding         trunk/x/test.txt
    Transmitting file data .
    Committed revision 2.
    test@test:/tmp/so/trunk$ cd /tmp/ 
    test@test:/tmp$ svn co http://localhost:8080/svn/stackoverflow so1 --username=admin 
    A    so1/trunk
    A    so1/trunk/x
    A    so1/trunk/x/test.txt
    A    so1/branches
    A    so1/tags
    Checked out revision 2.
    test@test:/tmp$ cd /tmp/so1/trunk/ 
    test@test:/tmp/so1/trunk$ svn remove x 
    D         x/test.txt
    D         x
    test@test:/tmp/so1/trunk$ svn ci -m "" 
    Deleting       trunk/x
    
    Committed revision 3.
    test@test:/tmp/so1/trunk$ mkdir x 
    test@test:/tmp/so1/trunk$ cp ../../so/trunk/x/test.txt x 
    test@test:/tmp/so1/trunk$ ll /tmp > x/test.txt 
    test@test:/tmp/so1/trunk$ svn add x/ 
    A         x
    A         x/test.txt
    test@test:/tmp/so1/trunk$ svn ci -m ""
    Adding         trunk/x
    Adding         trunk/x/test.txt
    Transmitting file data .
    Committed revision 4.
    test@test:/tmp$ cd so/trunk/
    test@test:/tmp/so/trunk$ svn up
    D    x
    A    x
    A    x/test.txt
    Updated to revision 4.
    test@test:/tmp/so/trunk$ 
    

    显然我尝试了与您相同的方法并且没有再次遇到任何问题。你用的是什么版本的svn?

    export REPOPATH=/tmp/svntest
    test@test:/tmp/co2/trunk$ rm -rf $REPOPATH
    test@test:/tmp/co2/trunk$ mkdir $REPOPATH
    test@test:/tmp/co2/trunk$ svnadmin create $REPOPATH/repo
    test@test:/tmp/co2/trunk$ svn co file:///$REPOPATH/repo co1
    svn: Repository UUID '2d803eb8-2030-4dd3-bb6f-34ab07c74813' doesn't match expected UUID '82764ae8-6410-4565-933f-9a420cb60013'
    test@test:/tmp/co2/trunk$ svn co file:///$REPOPATH/repo co2
    svn: Repository UUID '2d803eb8-2030-4dd3-bb6f-34ab07c74813' doesn't match expected UUID '82764ae8-6410-4565-933f-9a420cb60013'
    test@test:/tmp/co2/trunk$ 
    test@test:/tmp/co2/trunk$ cd $REPOPATH/co1
    bash: cd: /tmp/svntest/co1: No such file or directory
    test@test:/tmp/co2/trunk$ mkdir folder
    mkdir: cannot create directory `folder': File exists
    test@test:/tmp/co2/trunk$ echo content > folder/file.txt
    test@test:/tmp/co2/trunk$ svn add folder
    svn: warning: 'folder' is already under version control
    test@test:/tmp/co2/trunk$ svn commit folder -m ""
    test@test:/tmp/co2/trunk$ 
    test@test:/tmp/co2/trunk$ cd $REPOPATH/co2
    bash: cd: /tmp/svntest/co2: No such file or directory
    test@test:/tmp/co2/trunk$ svn up
    At revision 10.
    test@test:/tmp/co2/trunk$ 
    test@test:/tmp/co2/trunk$ cd $REPOPATH/co1
    bash: cd: /tmp/svntest/co1: No such file or directory
    test@test:/tmp/co2/trunk$ svn del folder
    svn: Use --force to override this restriction
    svn: 'folder/file.txt' is not under version control
    test@test:/tmp/co2/trunk$ svn commit -m ""
    test@test:/tmp/co2/trunk$ mkdir folder
    mkdir: cannot create directory `folder': File exists
    test@test:/tmp/co2/trunk$ svn add folder
    svn: warning: 'folder' is already under version control
    test@test:/tmp/co2/trunk$ svn commit -m ""
    test@test:/tmp/co2/trunk$ 
    test@test:/tmp/co2/trunk$ cd $REPOPATH/co2
    bash: cd: /tmp/svntest/co2: No such file or directory
    test@test:/tmp/co2/trunk$ echo changed_content > folder\file.txt
    test@test:/tmp/co2/trunk$ svn up
    At revision 10.
    test@test:/tmp/co2/trunk$ svn --version
    svn, version 1.6.6 (r40053)
       compiled Dec 12 2009, 05:04:54
    
    Copyright (C) 2000-2009 CollabNet.
    Subversion is open source software, see http://subversion.tigris.org/
    This product includes software developed by CollabNet (http://www.Collab.Net/).
    
    The following repository access (RA) modules are available:
    
    * ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
      - handles 'http' scheme
      - handles 'https' scheme
    * ra_svn : Module for accessing a repository using the svn network protocol.
      - with Cyrus SASL authentication
      - handles 'svn' scheme
    * ra_local : Module for accessing a repository on local disk.
      - handles 'file' scheme
    

    【讨论】:

    • 我在原始帖子中添加了一个脚本,以更详细地说明我的场景。
    • 不同之处似乎在于,在我的场景中,文件在执行更新(“so”)的工作副本中被修改,而不是按原样执行删除(“so1”)的工作副本脚本中的情况。
    • 我不确定您的输出中发生了什么,您似乎遇到了很多错误?
    • 无论如何,我将运行脚本的输出添加到原始帖子中,因此您可以看到我得到的输出。我已经使用 SVN 1.6.6 和 1.6.12 进行了尝试。
    【解决方案5】:

    Tree Conflicts 很好地概述了树冲突 及其解决方法。在某些情况下,svn revert 也可能会有所帮助,但会丢失所有本地修改。作为最后的手段,一个新的工作副本与“破碎”副本的手动合并更改将使您回到正轨。绝对是颠覆的阴暗面。

    【讨论】:

    • 不幸的是我已经检查了树冲突的概述,但遗憾的是它没有告诉我如何解决这个特定的场景。我在我们的应用程序中遇到了这个问题,它依赖 SVN 来处理某些用户,而不是在命令行上,因此我真的很想避免奇怪的黑客攻击并坚持使用 SVN API。
    • 我刚刚遇到了“树冲突:本地添加,更新时传入添加”的树冲突错误问题。我尝试了您建议的 svn revert 选项,效果很好。我完全忘记了我可以做到这一点(因为我几乎不必使用该命令)。谢谢!
    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 2011-05-28
    • 2019-12-14
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2011-02-24
    相关资源
    最近更新 更多