【问题标题】:What should I do when 'svn cleanup' fails?'svn cleanup' 失败时我该怎么办?
【发布时间】:2010-09-14 14:13:14
【问题描述】:

我在工作文件夹中有很多更改,并且尝试进行更新时搞砸了。

现在,当我发出“svn cleanup”时,我得到:

>svn cleanup .
svn: In directory '.'
svn: Error processing command 'modify-wcprop' in '.'
svn: 'MemPoolTests.cpp' is not under version control

MemPoolTests.cpp 是另一个开发人员添加的新文件,并在更新中被删除。它以前不存在于我的工作文件夹中。

我可以做些什么来尝试前进而无需签出存储库的新副本?

澄清:感谢您提出有关将目录移开并删除新副本的建议。我知道这是一种选择,但我想避免这种选择,因为有许多更改嵌套在多个目录深处(这应该是一个分支......)

我希望有一种更积极的方式来进行清理,也许以某种方式强制文件 SVN 无法恢复到已知状态(我尝试删除它的工作副本......帮助)。

【问题讨论】:

  • 回复:使用新副本。获取 Beyond compare 的副本,以比较不同的版本
  • amin 的解决方案不适合您吗?否则肯定是一个明显的答案吗?
  • 确保任何文件都没有被应用程序打开,这很容易忘记。 Process Explorer 和快速搜索路径对于发现这一点非常有用:technet.microsoft.com/en-us/sysinternals/bb896653.aspx
  • 恕我直言,“svn cleanup”命令的存在是对失败的承认。
  • 31 个答案,但没有一个被接受。学习点:经常提交。不要在没有提交的情况下进行太多复杂的更改。不仅因为 svn 可能会感到困惑。还因为您可能会感到困惑,并且可能希望通过回滚到先前的提交来恢复一些复杂的更改。如果您无法继续进行全新的结帐,则您的工作流程不是最佳的。所以不要与 svn 对抗,而是充分利用它。

标签: svn


【解决方案1】:

如果一切都失败了:

  1. 签出到新文件夹。
  2. 将修改过的文件复制过来。
  3. 再次入住。
  4. 在删除旧文件夹并使用新文件夹之前,将旧文件夹压缩到某个地方(你永远不知道 + 偏执狂是好事)。

【讨论】:

    【解决方案2】:

    此答案仅适用于 1.7 之前的版本(感谢 @ŁukaszBachman)

    Subversion 将其信息存储在每个文件夹中(在 .svn 中),因此如果您只是处理一个子文件夹,则不需要检查整个存储库 - 只需检查已损坏的文件夹:

    cd dir_above_borked
    mv borked_dir borked_dir.bak
    svn update borked_dir
    

    这将为您提供 borked 文件夹的良好工作副本,但您仍然在 borked_dir.bak 中备份您的更改。同样的原则也适用于 Windows/TortoiseSVN。

    如果您在独立文件夹中有更改,请查看

    svn checkout -N borked_dir   # Non-recursive, but deprecated
    

    svn checkout --depth=files borked_dir
    # 'depth' is new territory to me, but do 'svn help checkout'
    

    【讨论】:

    • 使用您的建议“如果您只是处理一个子文件夹,则不需要签出整个存储库”,从而节省了大量时间
    • 这对我有用 - 我所做的只是 svn up 与另一个标签中 svn up 中间的同一个 repo - 我忘记了我已经这样做了,并且在晚上让它不完整之前。
    • 不再正确 - 最新版本的 SVN 现在只使用一个 .svn 目录。
    【解决方案3】:

    我遇到了完全相同的问题。我无法提交,清理会失败。

    使用命令行客户端时,我看到一条错误消息,指出无法将文件从 .svn/props 移动到 .svn/prop-base

    我查看了具体的文件,发现它被标记为只读。删除只读属性后,我能够清理文件夹并提交我的更改。

    【讨论】:

    • 我放弃了那棵树,最后得到了一棵新的。但是感谢您下次检查的提示。
    • 哈哈...我什至将 .svn\pristine 区域中的文件夹从 {name} 重命名为 {name}_old ,然后再改回原来的 {name} 并且成功了
    【解决方案4】:

    如果不能从头再来...

    我删除了.svn 目录中的日志文件(我还删除了.svn/props-base 中的违规文件),进行了清理,然后恢复了更新。

    【讨论】:

    • 我在这里遇到了与原始问题类似的问题(由于 svn 结帐中断)。这为我修好了。虽然我也必须去父目录并在那里做同样的事情。
    • +1 我无法告诉你我有多少次遇到这种情况。如果是子子文件夹没问题,删除整个文件夹,清理更新即可。但是当它是根级别的文件时,这不是一个便宜的选择(需要几个小时才能再次签出整个项目)。很棒的提示 - 非常感谢。
    • 对我来说,删除锁定文件做到了。也许有人感兴趣。您可以使用以下命令递归删除它们:rm -rf find . -type f -name lock
    • happy-coding 的命令不起作用。这样做:sudo rm -rf | find . -type f -name lock
    • 我找不到.svn/prop-base 我有.svn/[pristine|tmp|entries|format|wc.db]
    【解决方案5】:

    它可能不适用于所有情况,但是当我最近遇到这个问题时,我的“修复”是升级我系统上的 Subversion 包。我一直在运行 1.4.something,当我升级到最新版本(在我的情况下为 1.6.6)时,结帐工作正常。

    (我确实尝试过重新下载它,但对干净目录的结帐总是挂在同一位置。)

    【讨论】:

      【解决方案6】:

      您可能会遇到两个文件名仅大写不同的问题。如果遇到这个问题,创建另一个工作副本目录并不能解决问题。

      当前的 Windows(即蹩脚的)文件系统根本无法理解 FilenameFILEname 之间的区别。您有两种可能的解决方法:

      1. 在具有真实文件系统(基于 Unix)的平台上签出、重命名文件并提交更改。
      2. 当您使用 Windows 时,您可以在 Eclipse SVN 存储库浏览器中重命名文件,该浏览器可以识别差异并在那里重命名文件。
      3. 您也可以使用svn rename -m "broken filename case" http://server/repo/FILEname http://server/repo/filename 从任何命令行 SVN 客户端远程重命名有问题的文件

      【讨论】:

      • 这原来是我的问题;一位同事不知何故设法签入了几个 Xcode 项目文件,每个文件都有两个副本,只是字母大小写不同。我使用 TortoiseSVN 来浏览 repo 并删除多余的文件。然后我删除了包含重复文件的本地文件夹,svn update 终于成功了。
      • 不仅仅是 Windows 问题。这也会影响 Mac。默认情况下,Macs HFS+ 文件系统也不区分大小写,但保留大小写的文件名。为了解决这些问题,我在硬盘驱动器上设置了第二个分区,该分区使用区分大小写的文件名。
      【解决方案7】:

      只读锁定有时会发生在装有 Windows 的网络驱动器上。尝试断开并重新连接。然后清理和更新。

      【讨论】:

        【解决方案8】:

        如果问题是区分大小写(在签出到 Mac 和 Windows 时可能会出现问题)并且您没有签出到 *nix 系统的选项,那么以下应该可行。这是从一开始的过程:

        % svn co http://[domain]/svn/mortgages mortgages
        

        (结帐随之而来……然后……)

        svn: In directory 'mortgages/trunk/images/rates'
        svn: Can't open file 'mortgages/trunk/images/rates/.svn/tmp/text-base/Header_3_nobookmark.gif.svn-base': No such file or directory
        

        这里 SVN 试图检查两个名称相似但仅大小写不同的文件 - Header_3_noBookmark.gifHeader_3_nobookmark.gif。 Mac 文件系统默认不区分大小写,导致 SVN 在这种情况下阻塞。所以...

        % cd mortgages/trunk/images/rates/
        % svn up
        svn: Working copy '.' locked
        svn: run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)
        

        但是,正如我们所知,运行 svn cleanup 不起作用。

        % svn cleanup
        svn: In directory '.'
        svn: Error processing command 'modify-wcprop' in '.'
        svn: 'spacer.gif' is not under version control
        

        spacer.gif 不是这里的问题……它只是无法将上一个错误移至下一个文件。所以我删除了.svn以外的目录中的所有文件,并删除了SVN日志。这使得清理工作正常进行,以便我可以检查并重命名有问题的文件。

        % rm *; rm -rf .svn/log; svn cleanup
        % svn up Header_3_nobookmark.gif
        A    Header_3_nobookmark.gif
        Updated to revision 1087.
        % svn mv Header_3_nobookmark.gif foo
        A         foo
        D         Header_3_nobookmark.gif
        % svn up
        A    spacer.gif
        A    Header_3_noBookmark.gif
        

        之后,我可以回到项目的根目录,然后运行svn up 来检查它的其余部分。

        【讨论】:

          【解决方案9】:
          $ ls -la .svn
          $ rm -f .svn/lock
          

          然后

          $ svn update
          

          希望对你有帮助

          【讨论】:

            【解决方案10】:

            在查看了此处引用的大多数解决方案后,我仍然收到错误消息。

            问题是case insensitive OS X。检出具有两个同名但大小写不同的文件的目录会导致问题。例如,ApproximationTest.java 和 Approximationtest.java 不应位于同一目录中。一旦我们删除了其中一个文件,问题就会消失。

            【讨论】:

              【解决方案11】:

              (在您尝试移动文件夹并进行新的结帐之前。)

              删除有问题的文件所在的文件夹 - 是的,甚至是 .svn 文件夹,然后 在最顶层/父文件夹上做一个svn cleanup

              【讨论】:

                【解决方案12】:

                我遇到了一个问题,在更新之后,SVN 显示一个文件夹存在冲突。奇怪的是,这只能通过命令行看到 - TortoiseSVN 认为这一切都很好。

                #>svn st
                !       my_dir
                !       my_dir\sub_dir
                

                svn cleanupsvn revertsvn updatesvn resolve 均未成功解决此问题。

                我最终解决了如下问题:

                • 在 .svn 目录中查找“sub_dir”
                • 使用 RC -> 属性取消选中条目文件上的“只读”标志
                • 打开条目文件并删除“未完成...”行和相应的校验和
                • 保存并重新启用只读标志
                • 对 my_dir 目录重复

                之后,一切都很好。

                请注意,我没有进行任何本地更改,所以我不知道如果您这样做了,您是否会面临风险。我没有使用其他人建议的删除/更新方法 - 我通过在 my_dir/sub_dir/sub_sub_dir 目录(以相同的症状开始)上尝试进入这种状态 - 所以我不想冒险让事情变得更糟又来了!

                不是很切题,但如果有人像我一样看到这篇文章可能会有所帮助。

                【讨论】:

                  【解决方案13】:

                  Subclipse 对 Windows 真正恶魔般的锁定行为感到困惑。 Unlocker 是你的朋友。这可以找到锁定的文件并强制释放锁定。

                  【讨论】:

                    【解决方案14】:

                    我刚刚在 Windows 7 64 位上遇到了同样的问题。我以管理员身份运行控制台并从问题目录中删除了 .svn 目录(收到有关日志或其他内容的错误,但忽略了它)。然后,在资源管理器中,我删除了不再显示为受版本控制的问题目录。然后,我进行了更新,一切都按预期进行。

                    【讨论】:

                      【解决方案15】:

                      我遇到了同样的问题。对我来说,原因是与 EasySVN 和(TortoiseSVN 或只是 SVN)的冲突。我使用 EasySVN 进行了自动更新和提交(这不起作用)。

                      当我关闭它时,我无法清理、提交或更新。以上解决方案均无效,但重新启动确实有效:)

                      【讨论】:

                      • Yaaaaay jimi,你是我的英雄(中)。
                      【解决方案16】:

                      每当我遇到类似问题时,我都会使用 rsync(注意:我使用 Linux 或 Mac OS X)来提供帮助:

                      # Go to the parent directory
                      cd dir_above_borked
                      
                      # Rename corrupted directory
                      mv borked_dir borked_dir.bak
                      
                      # Checkout a fresh copy
                      svn checkout svn://... borked_dir
                      
                      # Copy the modified files to the fresh checkout
                      # - test rsync
                      #   (possibly use -c to verify all content and show only actually changed files)
                      rsync -nav --exclude=.svn borked_dir.bak/ borked_dir/
                      
                      # - If all ok, run rsync for real
                      #   (possibly using -c again, possibly not using -v)
                      rsync -av --exclude=.svn borked_dir.bak/ borked_dir/
                      

                      这样您就有了全新的结帐,但使用相同的工作文件。 对我来说,这总是一种魅力。

                      【讨论】:

                        【解决方案17】:

                        在 SVN 1.7 中情况发生了变化,删除 .svn 目录中的日志文件的流行解决方案在迁移到数据库工作副本实现时是不可行的。

                        这就是我所做的似乎有效的方法:

                        1. 删除工作副本的 .svn 目录。
                        2. 在新的临时目录中开始新的结帐。
                        3. 取消结帐(我们不想等待所有内容都被拉下)。
                        4. 对此取消的结帐运行清理。
                        5. 现在我们有了一个新的 .svn 目录,其中包含一个干净的数据库(尽管没有/很少的文件)
                        6. 将此 .svn 复制到您损坏的旧工作目录中。
                        7. 运行 svn update,它会使新的部分 .svn 目录与旧工作目录同步。

                        这有点令人困惑,流程明智。本质上,我们所做的是删除损坏的 .svn,然后为相同的结帐路径创建一个新的 .svn。然后我们将这个新的 .svn 移动到我们的旧工作目录并将其更新到 repo。

                        我刚刚在 TSVN 中做了这个,它似乎工作正常,不需要完整的结帐和下载。

                        -乔迪

                        【讨论】:

                        • 我似乎每月至少这样做两次。这样的痛苦。 svn 团队应该添加这些步骤svn cleanup --force。当然,所有添加、删除和(在 1.8 中)重命名操作都会丢失。
                        • @Adgezaza 是的。是的。
                        • 这帮我修好了。有点不同:更改 svn 后,1 个特定文件夹的更新失败。删除该文件夹,一切都很好
                        • 我重新安装了 SVN(Tortoise SVN 1.8),从我的项目中删除了每个 ,svn 文件夹,然后执行了这里提到的操作,瞧!感谢作者!
                        • 只需格式化您的计算机并重新开始。另一种选择是将所有基础架构迁移到 git,这将比修复 SVN 存储库花费更少的时间。
                        【解决方案18】:

                        我遇到了同样的问题。在网上搜索了一下,找到了below article。然后意识到我登录的用户与我用来设置 SVN 的用户不同,基本上是权限问题。

                        【讨论】:

                          【解决方案19】:

                          看看

                          http://www.anujvarma.com/svn-cleanup-failedprevious-operation-has-not-finished-run-cleanup-if-it-was-interrupted/

                          来自上述链接的修复摘要(感谢 Anuj Varma)

                          1. http://www.sqlite.org/download.html安装sqlite命令行shell(sqlite-tools-win32)

                          2. sqlite3 .svn/wc.db "select * from work_queue"

                          SELECT 应该向您显示您的违规文件夹/文件,作为 工作队列。你需要做的是从工作中删除这个项目 排队。

                          1. sqlite3 .svn/wc.db "delete from work_queue"

                          就是这样。现在,您可以再次运行 cleanup - 它应该可以工作。或者你 可以在收到提示之前直接继续执行您正在执行的任务 运行清理(添加新文件等)

                          【讨论】:

                          • 请注意,不鼓励link-only answers,因此答案应该是搜索解决方案的终点(与另一个参考文献的中途停留相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
                          • Firefox 有sqlite manager 扩展,可以打开和编辑 .svn/wc.db 文件。提供方便的 GUI 来对 work_queue 进行等效操作。
                          • 如果您有最新版本的 SVN 和 Firefox,sqlite 管理器插件会在 30 秒内解决此问题。不用担心删除目录或使用 Repobrowser。在 2016 年,我认为这应该是公认的答案
                          • 对我来说运行“从 WC_LOCK 删除;”也是必需的。
                          • 完美运行! svn很烂!但是从 work_queue svn 中删除后给我另一个错误“svn locked”,只需使用乌龟运行(eclipse 没有选项)清理并检查“break locks”
                          【解决方案20】:

                          我尝试通过控制台执行svn cleanup 并收到如下错误:

                          svn: E720002: Can't open file '..\.svn\pristine\40\40d53d69871f4ff622a3fbb939b6a79932dc7cd4.svn-base':
                          The system cannot find the file specified.
                          

                          所以我手动创建了这个文件(空)并再次执行svn cleanup。这次就OK了。

                          【讨论】:

                            【解决方案21】:

                            我做了sudo chmod 777 -R . 以便能够更改权限。如果没有sudo,它将无法工作,给我与运行其他命令相同的错误。

                            现在您可以执行svn update 或其他操作,而无需废弃整个目录并重新创建它。这特别有用,因为您的 IDE 或文本编辑器可能已经打开了某些选项卡,或者存在同步问题。你不需要用这种方法废弃和替换你的工作目录。

                            【讨论】:

                              【解决方案22】:

                              我通过将一些同事的 .svn 目录复制到我的目录中然后更新我的工作副本来解决了这个问题。这是一个不错、快速且干净的解决方案。

                              【讨论】:

                                【解决方案23】:

                                当我遇到 TortoiseSVN (Windows) 的这个问题时,我会转到 Cygwin 并从那里运行“svn cleanup”;它为我正确清理,之后一切都可以从 TortoiseSVN 运行。

                                【讨论】:

                                • 这也适用于 cmd 窗口。我不知道为什么当 Tortoise 失败时它会起作用,但有时会。
                                【解决方案24】:

                                这里的答案对我没有帮助,但在再次检查项目之前,我关闭并打开了 Eclipse(Subversive 是我的 SVN 客户端),问题就消失了。

                                【讨论】:

                                  【解决方案25】:

                                  我最近也遇到了。对我来说,诀窍是在选择“清理”后,在弹出的选项对话框中,选中“Break Locks”,然后选择“OK”。它为我清理成功。

                                  【讨论】:

                                  • SVN 本身没有弹出对话框;也许你正在使用乌龟。 OP 正在使用命令行客户端,因此您的建议不是很有帮助。
                                  【解决方案26】:

                                  在终端中运行svn cleanup 命令(如果它在我的情况下从 Eclipse 失败):

                                  ~/path/to/svn-folder/$ svn cleanup
                                  

                                  我尝试了这里解释的不同解决方案,但没有一个奏效

                                  行动团队更新头部失败:

                                  svn: E155004: '/home/user/path/to/svn-folder' 中有未完成的工作项;首先运行“svn cleanup”。

                                  Action TeamCleanup 失败并出现同样的错误。

                                  对我有用的解决方案:在终端中运行 svn cleanup 命令

                                  命令成功。

                                  然后 TeamUpdate 在 Eclipse 中再次工作。

                                  注意:我的 SVN 版本是 1.9.3。

                                  如果svn cleanup 不起作用,还要检查Chris's answer

                                  【讨论】:

                                    【解决方案27】:

                                    在上一个答案中有一些非常好的建议,但是如果您在 Windows 上遇到 TortoiseSVN 问题(一个很好的产品,但是......)总是回退到命令行并先做一个简单的“svn cleanup” .

                                    在许多情况下,Windows 客户端不会运行清理命令,但使用 SVN 命令行实用程序进行清理工作正常。

                                    【讨论】:

                                      【解决方案28】:

                                      最新版本(我使用的是 1.9.5)通过在清理菜单上添加“Break locks”选项解决了这个问题。只需确保在清理时选中此复选框即可。

                                      【讨论】:

                                      • 现在看起来很明显!谢谢
                                      • 工作就像一个魅力!
                                      • 很适合我。
                                      • 成功了!当我看到这个解决方案时,我立即知道问题出在哪里......(我想):我有一个 excel 仍然打开,它修改了它。我想将我的更改提交到一些 java 文件并看到了 excel 文件,就像“我没有在那里更改任何内容......恢复”。哪个不起作用,然后我意识到它仍然打开,关闭它,F5,没有出现在提交中,所以继续提交。然后它告诉我“请运行清理”,从那里我被卡住了。那谢谢啦! :)
                                      【解决方案29】:

                                      虽然面临类似问题,但在存储库同步视图中手动合并有助于解决问题。

                                      一个文件名与另一个文件名冲突,它清楚地提到了这个问题。将较新的文件重命名为其他名称即可解决此问题。

                                      【讨论】:

                                        【解决方案30】:

                                        我刚刚从~\.svn\tmp 文件夹中删除了文件svn-xxxxxxxx,其中xxxxxxxx 是一个数字。

                                        【讨论】:

                                          猜你喜欢
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2012-05-09
                                          • 1970-01-01
                                          相关资源
                                          最近更新 更多