我正在从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中没有任何东西。我只想检查所有不同的快照,并删除已删除的文件。如果我在行李箱里没有任何东西,那么标记是不是一个坏主意?
答案 0 :(得分:3)
实际上有一个Subversion脚本为你做了这个名为svn-merge-repos.pl
的脚本我不是百分之百确定你是否理解Subversion的工作原理。您是否浏览了Subversion book?
在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
理论上,您可以为每个版本和分支创建一个新的branch
或tag
目录,而无需合并存储库。这就是我在进行StarTeam到Subversion转换时所做的事情。问题是你丢失了说修订版2.0.1和2.0.2之间的关系,因为它们不共享共同的历史记录。 99%的时间,这不是一个真正的问题,如果你需要什么,你可以随时回到原来的StarTeam档案。在几个月内,没有人会关心。
但是,如果您知道分支和标记之间的关系,并希望保留该信息,则必须执行上述两步脚本。
例如,您有一个来自2.0
的{{1}}分支,一个trunk
代码,一个2.0.1
代码和一个2.0.2
代码,您可能想这样做:
2.0.3
。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操作。这意味着您可以明确地从空主干
开始答案 4 :(得分:0)
从您的问题来看,您似乎正在完成滥用SVN的问题。删除整个trunk / src文件夹并将其替换为新文件夹是没有意义的,除非代码发生巨大变化。
而是为该版本创建一个标记。