提交快照时删除SVN中丢失的文件

时间:2011-12-20 17:16:56

标签: c++ svn version-control tortoisesvn version-control-migration

我正在从StarTeam转移到SVN,我决定拍摄每个版本的快照。但是,在处理修订版1中存在的文件时,我遇到了一个问题。

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

我尝试完全删除trunk / src /文件夹,然后将其替换为新的/ trunk / src /文件夹,但这似乎会导致与丢失文件冲突。当我 svn添加“一切,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上找到任何东西。有些人建议运行一个脚本来完成它,但我仍然对这个过程感到困惑。我是否需要删除旧的trunk文件夹,以便在本地删除丢失的文件?或者我应该使用脚本进行区分和删除?

谢谢!

旧的(不清楚)帖子:Migration to SVN, confused about deleting old files

编辑:

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

5 个答案:

答案 0 :(得分:3)

实际上有一个Subversion脚本为你做了这个名为svn-merge-repos.pl

的脚本

我不是百分之百确定你是否理解Subversion的工作原理。您是否浏览了Subversion book

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

# 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的{​​{1}}分支,一个trunk代码,一个2.0.1代码和一个2.0.2代码,您可能想这样做:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您应该改为创建标签 编辑:
svn状态列表所有更改
你可以打印所有删除的文件,如下所示:
svn状态| grep -E'^!' | awk'{print $ 2}'>的/ tmp /修改
您可以使用批处理对每个文件执行svn delete;)

编辑:( SVN迁移方法)

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

projectA/
|-- branches
|-- tags
|-- trunk


然后导入项目文件。

projectA/
|-- branches
|-- tags
`-- trunk
    |-- README
    `-- src

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

projectA/
|-- branches
|-- tags
|   `-- release-1
`-- trunk
    |-- README
    `-- src


在此之后,您应该根据需要编辑文件。 当您认为所有编辑都是“好”时,请提交。
在一些提交之后,如果要释放,请创建一个标记
Trunk应始终包含代码的最新版本 如果你是菜鸟,我强烈建议你在Windows上使用TortoiseSVN;)

答案 3 :(得分:1)

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

  

“此Perl脚本旨在将许多目录加载到   颠覆。如果您有多个.zip或者,这很有用   tar。{Z,gz,bz2}用于特定包并希望加载它们   颠覆“。

基本上你做的是:

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

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

开始

答案 4 :(得分:0)

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

而是为该版本创建一个标记。