如何防止SVN更新存储库中已有的目录

时间:2009-02-03 17:41:13

标签: svn ignore

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

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

我做了什么...

svn up
rm badDirectory

然后未来的svn up重新下载它。我想阻止它。

谢谢!

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

再次编辑以解决几条评论:

  

你有什么特别的理由吗?   无法签出该文件夹并保留   它?没有磁盘空间(可能不是因为   你可以退房吗?)安全   原因?

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

  

你能不能给出更好的描述   存储库的树结构?   是否存在与...相同级别的文件   坏目录,或只有其他目录   目录? -

基本结构:

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

13 个答案:

答案 0 :(得分:18)

我选择了稀疏的结账路线,类似于斯特凡提到的路线。区别在于我排除了整个目录。

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

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

作为参考,我们的树中有一个'prototype'目录,里面有一堆实验代码。由于我不在这个领域工作,所以我没有兴趣在我的多个开发树中使用1G来源。

答案 1 :(得分:10)

您可以执行sparse checkout

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 
...

答案 2 :(得分:4)

您可以使用脚本svn update - 非递归当前目录,然后分别更新剩余的子目录。使用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

答案 3 :(得分:3)

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

当你想提交时,你需要把它放回去,至少在包含坏目录的上层。

答案 4 :(得分:1)

更新除了一些错误目录之外的所有当前位置数据:

svn up `svn ls | grep -v badDirectory`

答案 5 :(得分:0)

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

并明确对您想要的更新。

小批量文件会使其容易重复

\ 0

答案 6 :(得分:0)

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

例如

projet - non-essential folder 
       \ essential folder

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

答案 7 :(得分:0)

已提供的解决方案,我要说定期忽略存储库的一部分的必要性是存储库结构不良的明显标志。尝试找到一种方法将其移动到存储库内的不同位置或类似的东西。

答案 8 :(得分:0)

Kirby的解决方案很简洁,但不会更新当前目录。

如果你有这样的结构:

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

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

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

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

(这是bash别名语法。如果你使用的是另一个shell,请根据需要进行修改)

答案 9 :(得分:0)

使用以下命令

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

继续在-exec之前追加所有目录! -name directoryname

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

答案 10 :(得分:0)

虽然考虑特定于供应商的解决方案,但在TortoiseSVN中,您可以按照manual page中描述的程序在“Checkout Depth”部分中列出之后实现它。

  

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

     

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

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

答案 11 :(得分:0)

我看到这个问题在很长一段时间内被问到,但如果你仍然感兴趣,我偶然发现了一个很好的博客,解释了使用“svn:ignore”的不同方法

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

正如博客中所解释的那样,您可以在文件中创建“坏文件夹”列表并使用“svn propset svn:ignore -R-F bad_folder_list_file”

希望有所帮助!

答案 12 :(得分:-2)

所以我想出了我认为最快的答案问题。由于SVN没有办法自动保存我不想更新的目录...

这是我现有的目录结构:

根   - > goodDir 1   - > goodDir 2   等

我已从结帐中删除了错误的目录。我无法从根目录执行'svn up',因为它会尝试重新检查错误的目录。

但是,以下命令很有效:

  ls | xargs svn up

简短,甜美,简单,易记。