Subversion的奇怪问题 - 当尝试重新创建USED在我的存储库中的目录时,“文件已经存在”

时间:2009-09-10 22:03:22

标签: svn

所以 - 以前我曾经有一个名为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'

14 个答案:

答案 0 :(得分:62)

当我删除文件夹(和子文件夹)并转到从头重新创建时,我遇到了类似的问题。您通过手动删除和重新添加文件夹来获得此错误(而文件似乎可以应对此问题)。

经过一些令人沮丧的捣乱,发现我不得不:
(在Windows上使用TortoiseSVN)

  1. 将冲突的文件夹移出工作副本(这样我就不会丢失正在进行的工作)
  2. 执行将svn update添加回原始文件/文件夹的工作副本
  3. svn delete文件夹
  4. commit
  5. 将新文件夹复制回工作副本(确保删除里面的所有.svn文件夹)
  6. commit
  7. 不幸的是,它(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)

  1. 将新路径重命名为temp
  2. 恢复新路径(不是临时!),因此svn不会尝试提交它
  3. 提交其余更改
  4. 复制存储库中的路径:svn copy -m“复制路径”-r
  5. 更新您的工作副本
  6. mv从temp到新路径的所有文件,来自更新
  7. 自修订以来提交您的本地更改
  8. 祝你有个美好的一天,包括历史; - )

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

  1. 将/工作复制/罪犯移至临时位置。
  2. svn + ssh://svn.example.com/repo/offender svn checkout to / working-copy / offender。
  3. 手动将文件从临时位置移动到新的结帐中。
  4. 删除临时位置。

答案 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)

如果存储库中存在通过当前事务创建的对象,则会发生这种情况。

简单方案:

  1. 两次检查某个目录,如DIR1和DIR2
  2. 在两个
  3. 中制作'svn mkdir test'
  4. 从DIR1提交
  5. 尝试提交DIR2(没有svn up),SVN将返回此错误
  6. 从两个工作副本添加相同文件时也是如此。

答案 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)

问题是结账是在笔记本电脑上进行的,在这种情况下,颠覆无法应对离线同步。这个问题可以在其他笔记本电脑上重现,而在桌面上我可以检查同一个存储库。

我希望这个答案对你有帮助,我花了很长时间才找到答案。