以下是我的情景:
假设我们有一个SVN repo,其中包含以下内容: MyFolder文件 MyFolder中\ file.txt的
现在我创建了两个这个仓库的结账,co1和co2。
在co1中我们修改file.txt。 在co2中我们:
现在如果我在co1中尝试更新,我会遇到树冲突:
A + C myfolder > local edit, incoming delete upon update
M + myfolder\file.txt
我想保留myfolder和修改过的文件,所以我解决了树冲突:
svn resolve --accept working folder
现在,如果我尝试提交,我会收到“svn:Directory'/ myfolder'已过期”。如果我尝试使用svn up myfolder解决此问题,我会再次遇到树冲突:
A + C folder > local add, incoming add upon update
M + myfolder\file.txt
好的,我们再试一次svn resolve --accept工作文件夹。但是我们仍然无法提交,我们得到的结果是“svn:Directory'/ 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
答案 0 :(得分:39)
我想到了
svn resolve --accept working PATH_TO_FILE
最终应该:
解决了'PATH_TO_FILE'的冲突状态
答案 1 :(得分:16)
Tree Conflicts概述了树冲突及其解决方案。在某些情况下,svn revert
可能会有所帮助,同时会丢失所有本地修改。作为最后的手段,一个新的工作副本与“破碎”的手动合并更改将使您重新回到正轨。绝对是颠覆的黑暗面。
答案 2 :(得分:4)
尝试
C:\svntest\co2>move folder folder.SAVE
C:\svntest\co2>svn revert folder
C:\svntest\co2>svn update
然后,Svn应该引入一个与folder
相同的新co1
目录版本。然后,您可以使用folder.SAVE
。
答案 3 :(得分:1)
我无法重现你提到的内容。这是我尝试过的。
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
答案 4 :(得分:0)
在这种特殊情况下,我认为您必须手动重新应用本地更改。也就是说,创建一个补丁文件(svn diff> mine.patch,或在其他地方复制文件),还原您的更改或使用他们的解析,然后应用补丁(或复制文件)。在应用更改之前,您可能需要在重新创建的文件夹中复制文件的基础。
就像zellus所说,这是颠覆的阴暗面,这是当前实现无法处理的。然后,删除文件夹并添加一个相同名称的文件夹听起来不太合适。你期望颠覆做什么?如果文件没有在文件夹中重新创建怎么办?如果它的内容不同会怎么样?
通过不删除要保留的文件夹来尝试完全避免这种情况:)