SVN:查找更新为不存在的文件
SVN: find files updated to nonexistence
我正在编写一个 shell 脚本,它可以存储 SVN 工作副本的实际状态并在以后恢复它,完全按照原来的样子。目前,我遇到了一个问题,即文件和目录的特定、罕见的修订组合似乎无法检测到。
假设有一个包含两个修订版的存储库。
有两种情况:
假设foo
是一个只存在于版本2的文件(或目录),一开始整个工作副本都是版本2,那么foo
(并且只有 foo
)更新到修订版 1。
假设bar
是一个只存在于版本1的文件(或目录),一开始整个工作副本都是版本1,那么bar
(并且只有 bar
)更新到修订版 2。
这两种情况非常相似,但似乎他们有不同的解决方案。在这两种情况下,文件(或目录)都会消失。但是,命令 svn status
的输出不包含相关信息。
如何通过 shell 脚本创建此类文件和目录的列表?
有一个简单但不好的解决方案。可以使用命令 svn list
获取当前版本中应存在的文件列表,并将其与实际存在的文件列表进行比较。
这个解决方案是不可接受的,因为它会花费很多时间并且会产生很大的服务器流量。
我发布了我能想到的最佳答案。尽管如此,它仅适用于第一种情况并且存在误报。
我找到了第一种情况的部分解决方案。
svn status -u | grep '^........\*........ ' | cut -c 22-
此代码显示所有存在于头版本中但不存在于当前版本中的文件。这从第一种情况中找到文件和目录。但是,当父目录(仍然存在)更新为较低版本时删除文件时,它会产生误报。
我曾经尝试做你正在做的同样的事情,但我遇到了很多极端情况,最终我走向了一个完全不同的方向。我没有使用脚本,而是使用了本地 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 命令(add
,commit
、branch
、checkout
等)。对于有 Subversion 经验和新手 git 的人来说会更容易一些; git svn
更适合那些对 git 有经验并坚持使用 Subversion 存储库的人。
我正在编写一个 shell 脚本,它可以存储 SVN 工作副本的实际状态并在以后恢复它,完全按照原来的样子。目前,我遇到了一个问题,即文件和目录的特定、罕见的修订组合似乎无法检测到。
假设有一个包含两个修订版的存储库。 有两种情况:
假设
foo
是一个只存在于版本2的文件(或目录),一开始整个工作副本都是版本2,那么foo
(并且只有foo
)更新到修订版 1。假设
bar
是一个只存在于版本1的文件(或目录),一开始整个工作副本都是版本1,那么bar
(并且只有bar
)更新到修订版 2。
这两种情况非常相似,但似乎他们有不同的解决方案。在这两种情况下,文件(或目录)都会消失。但是,命令 svn status
的输出不包含相关信息。
如何通过 shell 脚本创建此类文件和目录的列表?
有一个简单但不好的解决方案。可以使用命令 svn list
获取当前版本中应存在的文件列表,并将其与实际存在的文件列表进行比较。
这个解决方案是不可接受的,因为它会花费很多时间并且会产生很大的服务器流量。
我发布了我能想到的最佳答案。尽管如此,它仅适用于第一种情况并且存在误报。
我找到了第一种情况的部分解决方案。
svn status -u | grep '^........\*........ ' | cut -c 22-
此代码显示所有存在于头版本中但不存在于当前版本中的文件。这从第一种情况中找到文件和目录。但是,当父目录(仍然存在)更新为较低版本时删除文件时,它会产生误报。
我曾经尝试做你正在做的同样的事情,但我遇到了很多极端情况,最终我走向了一个完全不同的方向。我没有使用脚本,而是使用了本地 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 命令(add
,commit
、branch
、checkout
等)。对于有 Subversion 经验和新手 git 的人来说会更容易一些; git svn
更适合那些对 git 有经验并坚持使用 Subversion 存储库的人。