【问题标题】:SVN: find files updated to nonexistenceSVN:查找更新为不存在的文件
【发布时间】:2016-02-06 23:18:11
【问题描述】:

我正在编写一个 shell 脚本,它可以存储 SVN 工作副本的实际状态并在以后恢复它,就像它原来一样。目前,我对文件和目录修订的特定、罕见组合存在问题,这似乎无法检测到。

假设有一个包含两个修订版的存储库。 有两种情况:

  1. 假设foo 是仅存在于修订版2 中的文件(或目录)。开始时整个工作副本位于修订版2。然后foo(并且仅foo)是更新到第 1 版。

  2. 假设bar 是仅存在于修订版1 中的文件(或目录)。开始时整个工作副本位于修订版1。然后bar(并且仅bar)是更新至第 2 版。

这两种情况非常相似,但似乎它们有不同的解决方案。在这两种情况下,文件(或目录)都会消失。但是,svn status 命令的输出不包含任何相关信息。

如何通过 shell 脚本创建此类文件和目录的列表?


有一个简单但不好的解决方案。可以使用命令svn list 获取当前版本中应该存在的文件列表,并将其与实际存在的文件列表进行比较。

这种解决方案是不可接受的,因为它需要大量时间并且会产生大量的服务器流量。


我发布了我能想到的最佳答案。不过,它仅适用于第一种情况并且有误报。

【问题讨论】:

  • 你的意思是cp -a?
  • @EtanReisner 这个解决方案不适合我的项目。他们中的大多数有数百兆字节。复制太多了。大多数情况下,只有几个小文件被更改。这就是为什么我要编写脚本来仅复制更改的文件。

标签: bash shell svn revisions


【解决方案1】:

我曾经尝试过和你做同样的事情,但遇到了很多极端情况,最终我走向了完全不同的方向。我没有使用脚本,而是使用了本地 git 存储库。

从 Subversion 存储库中检查一个工作副本,然后使用 git init 在该文件夹中创建一个本地 git 存储库。将 Subversion 工作副本的全部内容添加到 git 存储库 - 包括 .svn 元数据目录 - 使用 git add 后跟 git commit。 Git 现在正在跟踪您的工作副本以及与之关联的所有 Subversion 元数据。我当前的 git 存储库有 5 个不同的分支,每个分支都基于不同的 Subversion 修订版,并包含尚未提交到 Subversion 存储库的不同更改集。 git 存储库可以轻松地在它们之间来回切换,Subversion 就像它们都是独立的工作副本一样工作。即使对于大型工作副本,git 在高效存储内容和快速切换分支方面也做得很好。

请注意,这与git svn 命令不同,后者是 git 直接与 Subversion 存储库交互的方法。我发现git svn 使用起来更复杂,也更容易破坏。在 git 存储库中包装一个普通的 Subversion 工作副本允许我仍然使用 Subversion 执行所有存储库操作,并且只需要我学习一些基本的 git 命令(addcommitbranchcheckout , 等等)。对于有 Subversion 经验和 git 新手的人来说,这会更容易一些; git svn 更适合有 git 经验并坚持使用 Subversion 存储库的人。

【讨论】:

  • 这可能与我的其他 SVN 脚本不兼容。我今天没有太多时间。我明天去看看。
  • @NO_NAME- 我走这条路的最初原因正是为了让我现有的 Subversion 脚本仍然有效。从 Subversion 的角度来看,一切都和以前一样。我的工作流程中唯一真正的变化是从一个工作副本状态更改为另一个涉及 git 命令,而不是调用复杂的脚本。
  • 这导致它们都是工作副本根目录中的 '.svn' 和 '.git' 目录。它可能会被 IDE 误解。 (我在 Eclipse 中对此进行了测试,效果很好,但这可能是个意外。)这也是工作副本的两倍大小。 (还是比cp -a好。)毕竟它仍然是一个不错的选择,尤其是在我将它包装在脚本中之后。
  • 迄今为止,我还没有任何 IDE 或工具抱怨该文件夹同时在 git 和 Subversion 中。您可能会在右键菜单中看到两组选项,但您应该能够分辨出哪一组(我知道 RabbitVCS 会将 git 和 svn 命令放在不同的组中)。如果将“.git”文件夹添加到 Subversion 的忽略列表中可能会有所帮助。
  • “您可能会在右键菜单中看到两组选项” 这并不总是正确的。例如,Eclipse 仅显示 SVN 的一组选项。它只是将项目归类为 SVN 类型,并没有进一步检查。幸运的是,它首先检查了 SVN,但它可能会随机变化。
【解决方案2】:

我找到了第一种情况的部分解决方案。

svn status -u | grep '^........\*........ ' | cut -c 22-

此代码显示所有存在于头版本中但不存在于当前版本中的文件。这会从第一种情况中找到文件和目录。但是,当父目录(仍然存在)更新为较低版本时删除文件时,它会产生误报。

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多