Subversion状态符号“~”代表什么意思?

116

当我执行svn status时,我得到了一个波浪符号。

这是在XCode中编辑项目后的输出结果。

svn status
M      build/Currency_Converter.build/Currency_Converter.pbxindex/imports.pbxbtree
M      build/Currency_Converter.build/Currency_Converter.pbxindex/pbxindex.header
M      build/Currency_Converter.build/Currency_Converter.pbxindex/symbols0.pbxsymbols
~      build/Currency_Converter.build/Currency_Converter.pbxindex/strings.pbxstrings
M      main.m
//more changed files

这是什么意思?我在谷歌或任何svn的秘籍上都找不到。

有趣的是,我只编辑了main.m文件,但有许多修改过的文件。 我不知道为什么会这样。 有没有人有在使用SVN和XCode时的提示? 我应该只将我的源文件放入版本控制中吗?

编辑:由于一个已被版本控制的文件被另一种类型的文件替换所导致。在这种情况下,strings.pbxstrings曾经是一个文件,现在变成了一个目录。 故事的教训是不要将您的构建文件夹放入版本控制中。


嗯,我不确定是否有一种“修复”它的方法,而不是重新添加。您可能需要发布另一个问题,询问是否有解决此状态的好方法,这样您会得到更多关注(因为当前问题已经得到答复)。 - Chad Birch
11个回答

90

SVN 书籍上说:

该项被视为一种对象(文件、目录、链接)的版本,但已被不同种类的对象所替代。

因此,它可能最初是一个单独的文件,但你将其更改为目录,或者类似这样的操作?


1
看起来你是对的。现在这是一个没有 .svn 文件的目录。有什么方法可以解决吗?我需要从 subversion 中删除它并重新添加吗? - Jamison Dance
49
最佳解决方案是给新对象(在您的情况下,即目录)重新命名;从导致冲突的存储库中“svn remove”该对象(可能是您已删除的文件),提交,然后将新对象重新命名并将其“svn add”到存储库中。再次提交。您将拥有 3 个修订版本的序列,分别是旧对象存在、被移除和新对象添加。 - Brian Lacy
9
如果有人阅读这篇文章遇到同样的问题:我也曾经遇到过这个问题,原因是我的代码库里有一些符号链接,在执行"sed -i"命令时被普通文件覆盖了。我重新创建了这些符号链接,然后"~"状态就消失了。 - j b
5
@JamieBullock今天因为同样的原因也发生了同样的事情。我甚至在知道问题所在之前就尝试了这个命令:svn status | grep ^~ | grep -o [^[:space:]]\*\$ | xargs svn revert,它能够恢复所有符号链接。 - Paul
在我删除目录中的.svn文件夹后(我以为我使用的是Subversion 1.7,后来发现我仍然在使用1.6),我遇到了这个问题。删除该目录,然后执行svn up对我有用。 - maciek
显示剩余5条评论

34
这是我所做的事情:
如果文件夹名为“Test”
1.将Test重命名为Test1
2.使用svn删除Test
3.将Test1重命名为Test

5
只要我在移除和添加之间进行提交,这个方法对我有用。具体操作如下:1. 将Test重命名为Test1;2. 从svn中删除Test;3. 进行提交并附上信息“Removed Test”;4. 将Test1重命名为Test;5. 向svn中添加Test;6. 再次进行提交并附上信息“Added Test”。 - Brandon Brodjeski
3
@sancelot的答案更好,如果使用svn delete --keep-local fileName,您无需重命名。 - DawnSong

15

来自

svn help status

'~' 版本项被不同类型的某个项阻挡

我只在文件权限发生变化且 svn 无法执行时看到过这种情况。

希望这可以帮到你。


15
svn delete --keep-local x
svn commit -m "del x"
svn add x
svn commit -m "blah"

你给出了最佳的答案。 - DawnSong
1
最佳答案!这解决了问题。在我的情况下,它是一个软链接被提交为常规文件。 - user3407196
同意,这是完美的解决方案。--keep-local标志真是太棒了。 - Joe Strout

12

最简单的解决方法是备份,然后删除具有此状态的文件夹或文件,然后执行“svn up”:这不一定是由文件替换的文件夹,可能只是.svn文件夹丢失或损坏。


10

当您删除文件夹中的 .svn 文件夹(例如当您删除一个目录,然后再创建相同的目录时),或者用符号链接替换文件夹或同名文件时,就会发生这种情况。

假设它是一个名为 a-folder 的文件夹,您可以通过在父文件夹中发出以下命令来修复此问题:

$ find a-folder -type d -name '.svn' -print0 | xargs -0 rm -Rf
$ svn up --force .
svn: Directory 'logs/.svn' containing working copy admin area is missing
$ svn up --force .
E    a-folder
...
Updated to revision n.

然后就是执行svn添加/删除操作,再次提交更改。


3
我想分享一下,在Joomla安装扩展时经常会遇到的问题。这些扩展是通过CMS安装的,并且由apache拥有,没有组写权限。通常的下一步是将文件添加到SVN中,但如果您不使用sudo或更改文件权限,则SVN在无法写入.svn目录时会失败。以下是解决方案:
mv foo foo-bak
svn up foo
svn revert foo

# just for good measure. Foo should not show up in the two following commands.
ls | grep foo
svn st | grep foo

mv foo-bak foo
svn add foo

3

遇到过类似的问题,SVN提示锁定。这是我们采取的措施:

  • 备份文件
  • 使用rm -r(linux)删除相关目录
  • 在该目录上运行svn cleanup
  • 在该目录上运行svn up --force

2
可能还涉及到Windows下的符号链接问题。当您将符号链接提交到SVN并在Windows下检出时,链接会变成普通文件,并报告为~。

1
那么你该如何解决这个问题呢? - user3407196

2

我经常在升级(例如)Joomla!,WordPress或Drupal的模块时遇到这种情况。有时候,.svn目录会被升级过程中删除。

# rename updated directory
mv foo foo.new

# restore the old directory
svn up foo

# merge / update the old directory with new items
# notice that the above command will preserve the obsolete files
# so you should do a diff -r in order to remove them
cp -r foo.new/* foo

# Add files commit, etc
svn add foo/*
svn delete foo/xx
svn commit -m "updated module"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接