2009-09-10 37 views
70

所以 - 我以前有一个名为mysql的目录。我删除了它,并决定从头开始 - 但是当我尝试创建新的mysql目录 - 我一直运行到“文件已存在”的错误:Subversion的奇怪问题 - 试图重新创建一个用于存储库的目录时,“文件已存在”

support:/etc/puppet/modules# mkdir mysql 
support:/etc/puppet/modules# svn add mysql/ 
A   mysql 
support:/etc/puppet/modules# svn commit -m " Test" 
Adding   modules/mysql 
svn: Commit failed (details follow): 
svn: File already exists: filesystem '/var/lib/svn/puppet/db', transaction '11-r', path '/trunk/modules/mysql' 
support:/etc/puppet/modules# svn delete mysql 
svn: Use --force to override this restriction 
svn: 'mysql' has local modifications 
support:/etc/puppet/modules# svn --force delete mysql 
D   mysql 

我看到了一些其他职位建议强制更新

support:/etc/puppet/modules# svn status 
support:/etc/puppet/modules# svn update 
At revision 11. 
support:/etc/puppet/modules# svn mkdir mysql 
A   mysql 
support:/etc/puppet/modules# svn commit -m "Test" 
Adding   modules/mysql 
svn: Commit failed (details follow): 
svn: File already exists: filesystem '/var/lib/svn/puppet/db', transaction '11-s', path '/trunk/modules/mysql' 

回答

11

我设法解决它通过恢复到我有mysql目录的最后一个版本,然后删除目录的内容,把新的内容,并检查新的信息回来。虽然我很好奇,如果有人能更好地解释那里发生了什么。

1

我不确定这是否对您有所帮助,但我想当您在删除它之后执行svn add mysql时,它只会重新实例化目录(因此请勿自己执行mkdir)。如果你自己创建一个目录,svn需要在其中有一个.svn目录,因为它已经“知道”它。

+0

听起来可行的为好,但因为我得到了它的更新到旧的版本,并从那里变化的工作,我真的不能检验这个理论。谢谢你的提示。 – gnarf 2009-09-10 22:23:30

12

已经有这种类型的问题。

我的解决办法是:

从SVN删除文件夹,但保持文件夹的副本某处,提交更改。 在备份副本中,递归删除其中的所有.svn文件夹。为此,您可以运行

#!/bin/bash 

find -name '.svn' | while read directory; 
do 
    echo $directory; 
    rm -rf "$directory"; 
done; 

删除本地存储库并重新检出整个项目。 不知道部分删除/结帐是否足够。

问候

+2

那就是基本上这个东西开始的地方,我很久以前就删除了'mysql',而我 - 但是当我厌倦了“文件已经存在”时,我只是试着做一个空目录......它仍然不会不添加它。另外'find -name'.svn'-exec rm -rf {} \;'执行你的bash的东西的方法要短得多 – gnarf 2009-09-10 22:18:37

+0

哦 - 没有注意到删除整个存储库并再次检出直到第二个阅读...如果我再次遇到这个问题,我一定会尝试 - 谢谢! – gnarf 2009-09-10 22:22:04

+0

好命令,将取代我的你的,谢谢。我曾多次添加问题,并且在干净的环境中检查始终帮助我解决问题。希望这对你也有效,如果你再次遇到它。祝贺 – Atmocreations 2009-09-10 22:56:17

62

我有这样一个问题,当我删除一个文件夹(和子文件夹),前往从头重新创建。你从手动删除和重新添加文件夹(而文件似乎应付与此确定)得到此错误。

一些令人沮丧的插科打诨后,发现我不得不:

  1. 移动冲突的文件夹(在Windows上使用TortoiseSVN)出的工作副本的(这样我就不会失去我的工作正在进行中)
  2. 做一个svn update它增加了旧文件/文件夹返回到工作拷贝
  3. svn delete文件夹
  4. commit
  5. 复制新的文件夹回工作副本(确保你删除里面的所有.svn目录)
  6. commit

不幸的是(A)需要两次提交,(B)丢失文件修订历史记录,因为只有它追溯到最近的重新添加(除非有人可以解释如何解决这个问题)。解决这两个问题的另一种解决方案是跳过步骤3和4,唯一的问题是旧的/不必要的文件可能仍然存在于您的目录中。你可以手动删除这些。

很想听听其他人对此的其他见解。

Simon。


[更新] OK,我再有同样的问题,就在这时,但有问题的文件夹是不是在最后一次提交的,因此一个update没有恢复它。相反,我不得不浏览存储库和delete违规文件夹。然后我可以add文件夹回到并且commit成功。

+0

+1 simillar问题 - 只是目录,而不是文件。恢复然后svn删除,然后svn添加,它就消失了。奇。 – serg10 2009-11-23 14:40:32

+2

+1通过浏览为我修复的存储库直接删除有问题的文件夹。 – 2013-01-04 10:47:13

1
  1. 重命名为临时
  2. 新路径还原新的路径(不温!),所以SVN不会尝试提交它
  3. 提交更改的其余
  4. 复制在仓库里的路径:SVN复制-m“复制路径” -r
  5. 更新你的工作拷贝
  6. MV从临时的所有文件到新的路径,这是从更新
  7. 提交由于r你的本地修改时空视点
  8. 拥有美好的一天,包括历史;-)
0

这种情况发生,如果有在库对象,由当前事务创建。

简单的场景:

  1. 结账某些目录的两倍,为DIR1和DIR2
  2. 使双方
  3. 'SVN的mkdir测试' 使从DIR1
  4. 尝试提交作出承诺DIR2( SVN将返回此错误

从两个工作副本中添加相同的文件时是同样的事情。

7

这是一个讨厌的...神秘的错误,没有明确的修复。

更新/恢复/提交没有在我的情况下工作。我没有做任何奇怪的事 - 只是一些svn动作。

什么工作对我来说是:

svn remove offender 
svn commit 
cd .. 
rm -fR parent 
svn up parent 
cd parent 
svn remove offender again 
svn commit 
copy offender back in (minus .svn dirs) 
svn add 
svn commit 

奇怪,至少可以说。基本上,由于某种原因,svn remove --force offender没有完全移除。这就是错误信息所说的内容。只有删除父母,然后更新父母,这是否变得明显,因为然后罪犯再次出现! svn再次删除罪犯,然后妥善删除它。

+1

为我工作。谢谢! – typeoneerror 2011-02-25 00:58:11

1

我在Netbeans上运行的项目上遇到了这个问题。 我只需右键单击该文件并进行更新以修复它(在SVN之后)。

16

有类似的问题。要解决它,从svn trunk更新本地文件的优先级选项。

svn update path/ --accept=mine-full 

之后您可以照常提交。当然,小心使用它。

+0

我只有一个文件处于添加状态。这svn更新命令为我解决了冲突。 – 2013-11-19 15:31:26

+0

你必须每次都运行这个命令。它不会使原始错误消失。 – 2016-08-18 13:50:55

1

该解决方案顺利合并,不会丢失历史:

  1. 移动/工作拷贝/罪犯到一个临时位置。
  2. 运行svn + SSH的svn签://svn.example.com/repo/offender到/工作拷贝/罪犯。
  3. 手动将文件从临时位置移动到新的结帐。
  4. 删除临时位置。
-1

问题是结帐发生在笔记本电脑上,在这种情况下,颠覆无法应付脱机同步。这个问题可以在其他笔记本电脑上重现,而在桌面上,我没有问题检出同一个存储库。

我希望这个答案西港岛线帮助你,我花了相当长的找出来。

0

根据Atmocreation的解决方案,除非您不需要重新签出整个项目,如果您现有的工作正在进行中,这很有用。

假设你有一个工作副本:

/foo/ 

其中包含目录:

/foo/bar/baz 

和你在提交收到错误消息:

svn: File already exists: filesystem '/foo/bar' 

备份酒吧内容:

mkdir -p ~/tmp/code_backup 
cp -r /foo/bar ~/tmp/code_backup 

删除从备份中的.svn目录的控制。确保你得到这个命令正确,否则你可以做非常严重的损害!如果您不确定,请手动删除它们。

find ~/tmp/code_backup/bar -name .svn -type d -exec rm -rf {} \; 

仔细检查副本是相同的:

diff -r -x .svn dist ~/tmp/code_backup/dist 

从工作副本删除违规的目录: CD /富 室射频酒吧

然后它从恢复repository:

cd /foo 
svn update bar 

Copy back从备份修改的文件:

cp -r ~/tmp/code_backup/bar /foo/ 

您现在应该可以提交没有错误。

1

我今天就遇到了这个问题,当Xcode的一个分支合并过程中坠毁。不知何故文件上传到svn存储库,但它没有正确记录在svn数据库中。我跑在目录下面的命令在本地文件存在:

svn add bad.file 
svn commit -m "Re adding bad.file" 

成功:

svn revert bad.file 
svn del svn://my.svnserver.com/svnDB/path/to/the/offending/file/bad.file 

然后,我从我的本地系统重新添加的文件!

0

你需要的是svn'export'命令。有了这个,您可以将文件或整个目录树置于另一个分支的另一个修订版本的状态中。

因此,像

rm file #without 'svn' in front! 
svn export myrepo/path/to/[email protected]<revision> . 
svn commit 
相关问题