0

我正在从 StarTeam 迁移到 SVN,并且我决定为我们的每个版本拍摄快照。但是,在处理版本 1 中存在的文件时,我遇到了一个问题,因为版本 2 被删除了。

文件丢失时如何提交快照?

我已经尝试完全删除 trunk/src/ 文件夹,然后用新的 /trunk/src/ 文件夹替换它,但这似乎会导致与丢失文件发生冲突。当我 svn add" 一切时,TortoiseSVN 似乎检测到文件丢失了,当我提交时,它似乎试图删除丢失的文件,但似乎失败了。大概这是因为它在删除文件后试图删除目录在那个目录里?

我收到以下错误:

deleting C:\trunk\src\myfile.h  // this one's okay
deleting C:\trunk\src\res
Commit failed (details follow):
Directory 'C:\trunk\src\res' is out of date
Item '/trunk/src/res' is out of date
You have to update your working copy first.

这个问题的解决方案是什么?当然,我不是第一个遇到这个问题的人,但我似乎在 google 或 stackoverflow 上找不到任何东西。有些人建议运行一个脚本来做到这一点,但我仍然对这个过程感到困惑。我是否需要删除旧的主干文件夹,以便在本地删除丢失的文件?或者我应该用脚本区分和删除?

谢谢!

旧(不清楚)帖子:迁移到 SVN,对删除旧文件感到困惑

编辑:

这是从一个快照到下一个快照。我正在从不同的存储库(StarTeam)迁移,所以我的主干中没有任何东西。我只想检查所有不同的快照并删除已删除的文件。如果我在后备箱中没有任何东西,标记不是一个坏主意吗?

4

5 回答 5

3

实际上有一个名为svn-merge-repos.pl的 Subversion 脚本可以为您执行此操作

我不是 100% 确定你理解 Subversion 是如何工作的概念。你读过 Subversion 书吗?

在 Subversion 中,没有像您在许多版本控制系统中找到的真实tags/labels或元数据。branches相反,您将标签和分支放在它们自己的目录中。要创建分支或标签,请将要分支或标签的内容复制到目录中:

# Creating a branch for 2.0 development from trunk
$ cp http://server/svn/module/trunk http://server/svn/module/branches/2.0

# Tagging my 2.0 development as 2.0.1
$ cp http://server/svn/module/branches/2.0 http://server/svn/module/tags/2.0.1

理论上,您可以简单地为您正在处理的每个版本和分支创建一个新目录branchtag目录,而无需合并存储库。这就是我在进行 StarTeam 到 Subversion 转换时所做的。问题是你失去了说修订版 2.0.1 和 2.0.2 之间的关系,因为它们没有共同的历史。99% 的情况下,这并不是什么问题,如果您需要任何东西,您可以随时返回原始 StarTeam 存档。几个月后,没人会在意。

但是,如果您知道分支和标签之间的关系,并希望保留该信息,则必须执行我上面描述的两步脚本。

例如,您有一个2.0来自 的分支trunk、一个2.0.1标签、一个2.0.2标签和一个2.0.3标签,您可能希望这样做:

  • 将分支 2.0.1 版本放到主干上。
  • 将中继复制到branches/2.0.
  • 将下一个分支放在主干上并将其复制到其分支(使用 svn-merge-repos.pl 脚本)
  • 最后,放上当前的主干。
  • 现在转到该branches/2.0目录并将其复制到tags/2.0.1. 使用 svn-merge-repos.pl 脚本,创建2.0.1发布branches/2.0并将其复制到tags/2.0.2. 继续前进,直到到达 2.0 分支的顶端。

这需要更长的时间才能完成,但这是可行的。上次我这样做时,我花了大约一个半星期的时间来完成整个转换。幸运的是,我先做了主干,然后是一天可以完成的主动发布。然后,我又回到了不那么活跃的东西上。

于 2011-12-20T17:44:04.720 回答
1

我当然不是 SVN 专家,但我相信您必须svn delete在下一次提交时为要删除的项目发出命令。它在这里描述。

于 2011-12-20T17:21:05.950 回答
1

您应该使用svn-load-dirs.pl

“这个 Perl 脚本旨在将多个目录加载到 Subversion 中。如果您有多个 .zip 或 tar.{Z,gz,bz2} 用于特定包并希望将它们加载到 Subversion 中,这将非常有用。 "

基本上你要做的是:

  • 按时间顺序导出所有标签
  • 创建一个空的存储库
  • 使用 svn_load_dirs.pl 在您的颠覆中的标签后“堆叠”标签。

svn_load_dirs.pl 为每个标签创建一个修订版,您也可以在每次导入后创建一个(subversion-)标签。它将跟踪所有已删除和添加的文件,并将执行适当的 svn 操作。这意味着您可以明确地从空主干开始

于 2011-12-21T01:11:32.120 回答
1

您应该创建一个标签。
编辑:
svn status 列出所有更改
,您可以像这样打印所有已删除的文件:
svn status | grep -E '^!' | awk '{print $2}' > /tmp/changes
您可以使用批处理对每个文件执行 svn 删除;)

编辑:(SVN 迁移方法)

假设您有一个名为 projectA 的项目和一个空白的 SVN 存储库。
首先,您应该像这样创建一个文件夹结构:

项目A/
|-- 分支机构
|-- 标签
|-- 后备箱


然后导入您的项目文件。

项目A/
|-- 分支机构
|-- 标签
`-- 后备箱
    |-- 自述文件
    `--src

导入后,您可以创建一个标签来“标记”初始版本:

项目A/
|-- 分支机构
|-- 标签
| `--发布-1
`-- 后备箱
    |-- 自述文件
    `--src


在此之后,您应该根据需要编辑文件。当您认为您的所有编辑都是“好”时,请提交。
在一些提交之后,如果你想释放,创建一个标签。

主干应始终包含最新版本的代码。
如果您是新手,我强烈建议您在 Windows 上使用 TortoiseSVN ;)

于 2011-12-20T17:23:25.493 回答
0

从您的问题来看,您似乎正在完成滥用 SVN。删除整个 trunk/src 文件夹并用新文件夹替换它是没有意义的,除非代码发生巨大变化。

相反,为发布创建一个标签。

于 2011-12-20T17:23:08.330 回答