所以 - 以前我曾经有一个名为mysql的目录。我删除了它,并决定重新开始 - 但是当我尝试创建新的mysql目录时 - 我一直遇到'File Already Exists'错误:
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'
答案 0 :(得分:62)
当我删除文件夹(和子文件夹)并转到从头重新创建时,我遇到了类似的问题。您通过手动删除和重新添加文件夹来获得此错误(而文件似乎可以应对此问题)。
经过一些令人沮丧的捣乱,发现我不得不:svn update
添加回原始文件/文件夹的工作副本svn delete
文件夹commit
commit
不幸的是,它(A)需要两次提交,并且(B)丢失文件修订历史记录,因为它只追溯到最近的重新添加(除非有人可以解释如何解决这个问题)。解决这两个问题的替代解决方案是跳过步骤3和4 ,唯一的问题是旧的/不必要的文件可能仍然存在于您的目录中。您可以手动删除它们。
很想听到别人可能对此有任何其他见解。
<强>西蒙。强>
[更新] 好的,我刚才又遇到了同样的问题,但是有问题的文件夹不是最后一次提交,所以update
没有恢复它。相反,我必须浏览存储库和delete
违规文件夹。然后,我可以add
重新插入文件夹并成功commit
。
答案 1 :(得分:17)
有类似的问题。要解决此问题,请从svn trunk更新,并选择本地文件的优先级。
svn update path/ --accept=mine-full
你可以照常提交。当然,小心使用它。
答案 2 :(得分:12)
已经遇到过这种类型的问题了。
我的解决方案是:
从svn中删除该文件夹,但在某处保留该文件夹的副本,提交更改。 在备份副本中,递归删除其中的所有.svn文件夹。为此你可以运行
#!/bin/bash
find -name '.svn' | while read directory;
do
echo $directory;
rm -rf "$directory";
done;
删除本地存储库并重新检出整个项目。 不知道部分删除/结账是否足够。
问候
答案 3 :(得分:11)
我设法通过恢复到我拥有mysql目录的最后一个版本来解决它,然后删除目录的内容,将新内容放入其中,并重新检查新信息。虽然我'我很好奇,如果有人对那里发生的事情有更好的解释。
答案 4 :(得分:7)
这是一个讨厌的......神秘的错误,没有明确的解决方法。
更新/恢复/提交在我的情况下不起作用。我没有做过任何奇怪的事 - 只是一些svn动作。
DID对我有用的是:
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再次删除罪犯然后正确删除它。
答案 5 :(得分:1)
我不确定这是否对您有所帮助,但我想当您在删除它之后执行svn add mysql
时,它只会重新实现目录(所以不要自己做mkdir)。如果您自己创建一个目录,svn需要一个.svn目录,因为它已经“知道”了它。
答案 6 :(得分:1)
答案 7 :(得分:1)
我在Netbeans上运行的项目中遇到了这个问题。 我只是右键单击该文件并更新以修复它(在SVN之后)。
答案 8 :(得分:1)
此解决方案顺利合并,不会丢失历史记录:
答案 9 :(得分:1)
当Xcode在分支合并期间崩溃时,我遇到了这个问题。不知何故,该文件已上传到svn存储库,但未正确记录在svn db中。我在本地存在文件的目录中运行以下命令:
svn revert bad.file
svn del svn://my.svnserver.com/svnDB/path/to/the/offending/file/bad.file
然后我从本地系统重新添加了该文件:
svn add bad.file
svn commit -m "Re adding bad.file"
成功!
答案 10 :(得分:0)
如果存储库中存在通过当前事务创建的对象,则会发生这种情况。
简单方案:
从两个工作副本添加相同文件时也是如此。
答案 11 :(得分: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 / foo rm -rf bar
然后从存储库中恢复它:
cd /foo
svn update bar
从备份中复制修改后的文件:
cp -r ~/tmp/code_backup/bar /foo/
您现在应该能够在没有错误的情况下提交。
答案 12 :(得分:0)
您需要的是svn'export'命令。通过这个,您可以将文件或整个目录树放在另一个分支的另一个修订的状态中。
类似
rm file #without 'svn' in front!
svn export myrepo/path/to/file@<revision> .
svn commit
答案 13 :(得分:-1)
问题是结账是在笔记本电脑上进行的,在这种情况下,颠覆无法应对离线同步。这个问题可以在其他笔记本电脑上重现,而在桌面上我可以检查同一个存储库。
我希望这个答案对你有帮助,我花了很长时间才找到答案。