从本地仓库中删除“已删除”文件

3
我如何删除已从Repo删除但尚未从本地删除的文件?
基本上,我正在使用powershell编写一个构建脚本,需要从Repo中获取最新的更改并进行检出,但可能有一些文件已从Repo中删除,但仍未从我的本地检出中删除。我的意思是,一个解决办法就是删除所有内容并进行干净的检出,但那太过昂贵,需要很长时间。我也可以做一个svn状态,并查找任何带有"D"的内容并在本地将它们删除,但那太麻烦了。我希望也能覆盖任何冲突和--force检出需要合并的文件。
是否有一些简单的命令,例如还原或检出开关,我错过了吗?
*编辑:实际上,我需要处理两种不同的情况:
A)在一个部分中,我需要保留工作副本中的任何修改并只检出没有冲突或合并的更改。我需要这个永远不会中止,这意味着我只想扔掉任何有问题的东西并保留工作/本地副本。
我想使用:svn update --accept mine-full --force(注意:这在根目录上而不是单个文件上)
B)在另一个部分中,我想覆盖任何更改并删除从repo中删除的文件。
我想使用:svn update --accept theirs-full --force(注意:这在根目录上而不是单个文件上)
这会起作用吗?还是--force(或--accept)不是我要使用的?
我使用update的主要担忧是,如果出现问题,它将中止整个过程,对吧?svn update与--force做了什么?它也不删除未版本化的项目。
恢复也不完全是我需要的,对吧?它不会删除我未版本化的任何项目。
此外,如果本地已经有文件,那么检出是否只会做与更新相同的事情呢?如果还没有任何内容存在,那么只需使用checkout将更简单。问题是,我无法指定--accept参数与svn checkout一起使用。我想我可以测试文件夹是否存在,然后相应地进行检查或更新。

3
svn up命令无法正常工作吗?它应该会为您删除文件(但同时也会更新其余的工作副本)。 - crashmstr
将更改从仓库更新到工作副本的命令是 update。如果有任何原因阻止您使用它,您应该清楚地解释,以便我们能够提供帮助。 - Álvaro González
@crashmstr:我已经编辑了我的上面的帖子。由于有两种不同的情况,svn update仍然是我想要做的吗?谢谢! - Jordan
@Alvaro:我已经编辑了我的上面的帖子。由于有两种不同的情况,svn update仍然是我想要做的吗?谢谢! - Jordan
2个回答

2

对于A部分,我使用了:

svn update --accept mine-full --force

对于B部分,我只是做了以下步骤:
步骤1:
svn revert $localPath

第二步:
svn update $localPath

第三步(使用 Powershell + svn 状态,但也可以在 *nix 中使用 rm -rf grep/sed 完成):
svn status $localPath --no-ignore |
                Select-String '^[?I]' |
                ForEach-Object {
                    [Regex]::Match($_.Line, '^[^\s]*\s+(.*)$').Groups[1].Value
                } |
                Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

0

如果您手动删除文件,则在更新本地存储库到缺少该文件的同一版本之前,该文件将被还原。因此,首要措施是尝试更新您的存储库。

svn update

有一些注意事项。首先,如果有人删除了文件但没有提交他的删除操作,则删除操作实际上并未在远程存储库中进行。其次,如果您修改了文件,则可能会出现冲突,因为存储库中的已删除文件与您磁盘上的已删除文件不同。

假设存在某种冲突,这会使更新变得困难。您应该尝试:

svn revert <problem file name>

然后尝试再次更新。

在没有很好了解情况的情况下使用--force选项几乎总是不明智的。基本上就像不听取专家建议一样。如果你比建议者更有经验,你知道要避免的注意事项和痛点。如果你没有比建议者更多的经验,你会伤害自己。--force不是一个“忽略警告,再试一遍”的标志,它是一个“无论如何都去做,即使完全搞砸了”选项。


嘿,我编辑了原帖以澄清一些内容。但是,这是为了一个构建脚本,所以即使我不能重新提交所有内容,只要由于检出失败或合并提示导致进程终止的情况不会发生,我就不必担心。 - Jordan
@Jordan,如果这是用于自动化构建脚本,它应该将整个源代码树“新鲜地”检出到一个新目录中。如果这是为了开发环境,那么用户应该没有问题输入这些命令。如果你正在做介于两者之间的事情,最好将这两种情况分开处理。 - Edwin Buck
1
@Jordan,我认为你误解了“svn revert”,它会将你恢复到从仓库检出的文件副本。在执行这样的命令后,该文件上就不可能有文件冲突,因此你的“svn update”对于该文件将可以干净地工作。 - Edwin Buck
这是一个构建脚本,但我不想进行全新的检出,因为源代码大约有10GB,检出未修改的代码需要很长时间。 此外,有时候脚本会在工作副本中进行编辑以进行临时构建和修复,而更改不应该被覆盖(部分A,不幸的是这不是我的选择)。至于svn revert,是的,但我能不能只使用svn update和--accept theirs-full --force之类的命令? - Jordan
我知道这一点,但它也不会删除在检出之后添加的未版本化文件,这正是我需要做的。 - Jordan
显示剩余5条评论

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