13

我不认为这不是标准的 svn 忽略问题。

我有一个存储库,其中包含我不想要的巨大目录。因为其他使用存储库的人这样做,我不能只是从树中删除它。但是,我不想每次执行 svn up 时都重新下载这个目录。我可以理解,忽略会阻止我拥有的目录被上传到 svn,但我怎么能告诉 svn 我不希望它重新下载已经在存储库中的特定目录。

我做什么...

svn up
rm badDirectory

然后future svn up重新下载它。我想阻止这种情况。

谢谢!

编辑:好的。我希望 SVN 有一个我还没有注意到的内置选项。我希望避免不得不“破解”颠覆的不足之处,但下面的选项似乎是可以接受的替代方案。

再次编辑以解决一些评论:

是否有特殊原因导致您无法签出该文件夹并保留它?没有磁盘空间(可能没有,因为你可以签出它)?安全原因?

我可以查看文件夹。整个 svn 存储库大约有 291 兆。其中 290 位于这个“坏”目录中。基本上,其他一些可以控制存储库的人(因此可以决定其中的内容)会在其中放置一个真正不需要的目录。我并不是说这是关于政策和使用 svn 的“正确和正确”方式的问题。我只是想知道是否有技术解决方案。

您能否更好地描述存储库的树结构?是否有与坏目录处于同一级别的文件,或者只有其他目录?——</p>

基本结构:

repository root
 - good dir 1
    - plenty of subdirs in all of these directories
 - good dir 2
 - good dir X
 - bad dir 1
 - bad dir 2
 - bad dir X 
 - good file 1
 - good file 2
 - good file X
4

13 回答 13

18

我选择了类似于 Stefan 提到的稀疏结帐路线。不同之处在于我排除了整个目录。

这是我为排除整个目录及其所有子目录所做的。注意:不需要的目录已经在我的磁盘上,所以我先将其删除。

$ rm -rf unwanted-directory
$ svn checkout url/to/repo/unwanted-directory unwanted-directory --depth empty
$ cd root/of/my/tree
$ svn update
<- 不需要的目录不是从存储库中获取的

作为参考,我们的树中有一个“原型”目录,其中包含一堆实验代码。因为我不在这个领域工作,所以我对在我的多个开发树中使用 1G 资源没有兴趣。

于 2011-02-16T18:24:40.563 回答
10

您可以进行稀疏结帐

svn co url/to/repo mywc --depth=files

这将为您提供一个 wc,其中只有文件,没有子文件夹。您现在可以获取所需的所有文件夹

svn up url/to/repo/subfolder1 --set-depth infinity 
svn up url/to/repo/subfolder2 --set-depth infinity 
svn up url/to/repo/subfolder3 --set-depth infinity 
...
于 2009-02-03T18:34:01.110 回答
4

您可以使用脚本 svn update --non-recursive 当前目录,然后以递归方式单独更新剩余的子目录。使用 bash 脚本,您可以遍历所有子目录并跳过有问题的子目录。

像这样的东西:

#!/bin/bash

BADDIR="bad"
FILELIST="*"

svn update --non-recursive

for file in $FILELIST
do
if [ -d $file ]
then
   if [ $file != $BADDIR ] 
   then
     svn update $file
   fi
fi
done
于 2009-02-03T17:47:23.467 回答
3

如果您重命名坏文件夹中的 .svn 目录然后运行更新,svn 将跳过该目录并说它已被删除,即使它仍然存在。

但是,当您要提交时,您需要将其放回原处,至少在包含错误目录的上层。

于 2009-02-03T17:49:10.157 回答
1

更新所有当前位置数据,除了一些坏目录:

svn up `svn ls | grep -v badDirectory`
于 2013-06-13T09:45:03.523 回答
0

您可以指定 --non-recursive 或 -N 来禁止它获取所有子目录

并且明确地对您想要的内容进行更新。

一个小批处理文件将使其易于重复

\0

于 2009-02-03T17:51:50.977 回答
0

已经提供了解决方案,我会说需要定期忽略存储库的一部分是存储库结构不良的明显迹象。尝试找到一种方法将其移动到存储库中的其他位置或类似的位置。

于 2009-02-04T11:42:55.777 回答
0

Kirby 的解决方案很干净,只是它不更新当前目录。

如果你有这样的结构:

root -
     |-subdir1
     |-subdir2
     |-fileA
     |-fileB

Kirby 的解决方案不会更新 fileA、fileB 和稍后添加到根目录的任何其他文件。

您需要添加一个“svn up -N”。您可以使用别名和分号来执行此操作:

alias myup='ls | args svn up; svn up -N'

(这是 bash 别名语法。如果您使用不同的 shell,请根据需要进行更改)

于 2009-03-25T15:51:20.943 回答
0

使用以下命令

find -maxdepth 1 ! -name . ! -name .svn ! -name badDirectory -exec svn up {} \;

继续在 -exec 之前附加所有目录,例如!-name 目录名

find -maxdepth 1 ! -name . ! -name .svn ! -name badDirectory ! -name badDirectory2 ! -name badDirectory3 -exec svn up {} \;
于 2011-02-25T08:09:59.627 回答
0

在考虑特定于供应商的解决方案时,在 TortoiseSVN 中,您可以按照手册页中描述的过程来实现它,在“结帐深度”部分中列出之后。

如果您签出一个稀疏的工作副本(即,通过为签出深度选择完全递归以外的其他内容),您可以稍后使用存储库浏览器(称为“存储库浏览器”的部分)或检查修改对话框(称为“本地和远程状态”的部分)。

在 Windows 资源管理器中,右键单击已签出的文件夹,然后使用 TortoiseSVN → Repo-Browser 调出存储库浏览器。找到您要添加到工作副本的子文件夹,然后使用上下文菜单 → 更新项目以修订...。

但是:我想补充一点,我会更改最后一步。不要从工作副本中找到要添加(或删除)的子文件夹,而是右键单击根文件夹,选择“将项目更新为修订...”,在工作深度上单击按钮“选择项目”并选择打开的文件管理器上的所有子项。

于 2011-11-10T19:41:22.717 回答
0

我看到这个问题在很久以前就被问过了,但如果你仍然感兴趣,我偶然发现了一个很好的博客,它解释了使用“svn:ignore”的不同方法

这是链接:http ://superchlorine.com/2013/08/getting-svn-to-ignore-files-and-directories/

如博客中所述,您可能可以在文件中创建“坏文件夹”列表并使用“svn propset svn:ignore -RF bad_folder_list_file”

希望有帮助!

于 2014-07-15T19:04:39.313 回答
-1

如果它不是您(或您的团队)日常工作所必需的文件夹,您可以要求管理员更新 svn 层次结构以将该文件夹移动到与您必须更新的文件夹相同(或更高)的级别。

例如

projet - 非必要文件夹
       \ 基本文件夹

并且您只需要更新(签出)“基本文件夹”,其他人也必须更新(签出)“非必要文件夹”。

于 2009-02-03T18:00:04.503 回答
-2

所以我只是想出了我认为最快的问题答案。由于 SVN 无法自动忽略我不想更新的目录...

这是我现有的目录结构:

根 -> goodDir 1 -> goodDir 2 等

我已经从结帐中删除了坏目录。我无法从根目录执行“svn up”,因为它会尝试重新检查坏目录。

但是,以下命令效果很好:

  ls | xargs svn up

简短、甜美、简单且易于记忆。

于 2009-02-18T21:09:40.487 回答