SVN检出忽略文件夹


Answers:


104

您不能直接忽略签出时的文件夹,但是可以在svn 1.5中使用稀疏签出。例如:

$ svn co http://subversion/project/trunk my_checkout --depth immediates

这会将文件和目录从项目主干中检入“ my_checkout”,但不会递归到这些目录中。例如:

$ cd my_checkout && ls
bar/ baz foo xyzzy/

然后将“ bar”的内容取下来:

$ cd bar && svn update --set-depth infinity

注意:某些1.5版本存在一个错误,阻止了此问题svn: Shallowing of working copy depths is not yet supported
gcb 2012年

79

是的,您可以使用SVN 1.6。您将需要先进行检出,然后将文件夹标记为要排除,然后删除不需要的文件夹。

svn checkout http://www.example.com/project
cd project
svn update --set-depth=exclude docs
rm -fr docs

从现在开始,对工作副本的任何更新都不会重新填充docs文件夹。

参见http://blogs.collab.net/subversion/2009/03/sparse-directories-now-with-exclusion/http://subversion.apache.org/docs/release-notes/1.6.html#sparse-目录排除以获取更多详细信息。

汤姆


2
受到支持是因为它使我不必结帐与我的工作无关的巨大文件夹。
dohpaz42

1
很棒,再加上svn清理,为我节省了12 GiB。
JonnyJD

1
难道这还不是最初检查所有内容吗?
Huangism

9

在1.5之前的版本中,我发现如果仅签出最上面的文件夹然后有选择地进行更新,则从那以后更新只会影响您签出的内容。就是

svn co -N foo
cd foo
svn up -N bar
svn up

-N标志使操作非递归。上面的代码不会在foo级别签出其他任何内容,例如。假设有一个文件夹lala,最终的svn不会检出该文件夹,但会更新bar

但是稍后,您可以svn up lala将其添加到结帐中。

大概这也适用于1.5。


6

这在TortoiseSVN客户端1.7.1中(可能在某些旧版本中也可用):

  • SVN检出->选择存储库的URL

  • 单击“检出项目”(在“检出深度”下),然后仅选择所需的文件夹!


4

您可以将docs文件夹放在外部存储库中,然后使用svn checkout --ignore-externals


这就是我们最终要跳过先前工作中的某些预建组件的方法。
Mark Bessey

2
我不明白这是什么external repository意思。你能解释一下吗?
维克多

4

是的,Subversion 1.5具有一个称为“ 稀疏签出”的功能,可以完成这种事情。


2
从阅读中可以看出,稀疏签出仅限制了签出的深度。他们不能忽略一个特定的文件夹。
John Millikin

当然,您可能需要做一些额外的工作,例如使用--depth立即数限制父文件夹的深度,然后检出除您要忽略的文件夹以外的所有其他文件夹。关键是,如果您需要使用这些工具,就可以使用它们。
格雷格(Greg Hewgill)

我很感谢提到SparseCheckouts,这确实很有趣,但是此响应并未解决原始问题。当然,我可以一次检出一个文件,这将导致拥有我想要的特定文件的本地副本,但是要单独处理每个文件实在是一件痛苦的事情。我相信这个问题的作者问的是忽略一个特定的文件夹,而不是x文件夹的深度,而是让计算机来做这些工作-您建议的相同工作可以手动完成。
barrypicker 2012年

svnbook.red-bean.com/en/1.7/svn的1.6+版本提供了额外的功能,可以忽略文件夹,并且可以更好地控制工作副本中包含/排除的内容(其中v1.5非常受此限制)。 advanced.sparsedirs.html
FruitBreak 2015年

3

我发现这个问题,是在寻找一种排除WebKit源代码同时排除回归测试的方法。我得出以下结论:

svn checkout http://svn.webkit.org/repository/webkit/trunk WebKit \
  --depth immediates

cd WebKit
find . \
  -maxdepth 1 -type d \
  -not -name '.*' \
  -not -name '*Tests' \
  -not -name 'Examples' \
  -not -name 'Websites' \
  | (while read SUBDIR; do svn update --set-depth infinity "$SUBDIR"; done)

请注意,您可以根据需要更改排除项,但是建议使用。*跳过工作目录(已经是最新的)和所有.svn目录。


这是什么语言?
小狗

这些是unix shell命令(它们也可以保存并作为脚本文件执行)
mrlem

2

我最近解决了相同的任务。这样做的目的是获取存储库下的文件夹/文件的即时列表,其中不包括所需的条目,然后检出其余文件夹并更新即时文件(如果有)。解决方法如下:

    # Path to the svn repository to be checked out
rpath=https://svn-repo.company.com/sw/trunk/ && \
    # This files are to be excluded (folders are ending with '/')
    # this is a regex pattern with OR ('|') between enties to be excluded
excludep='docs_folder/tests_folder/|huge_folder/|file1|file2' && \
    # Get list of the files/folders right under the repository path
filtered=`svn ls $rpath | egrep -v $excludep` && \
    # Get list of files out of filtered - they need to be 'uped'
files=`echo $filtered | sed 's| |\n|g' | egrep '^.*[^/]$'` && \
    # Get list of folders out of filtered - they need to be 'coed'
folders=`echo $filtered | sed 's| |\n|g' | egrep '^.*[/]$'` && \
    # Initial nonrecursive checkout of repository - just empty
    # to the current (./) working directory
svn co $rpath ./ --depth empty && \
    # Update the files
svn up $files &&\
    # Check out the all other folders finally.
svn co `echo $folders | sed "s|\<|$rpath|g"`

转到源工作目录。复制命令。糊。更改适当的URL并排除模式。运行命令。

谢谢,


1
嘿,开发人员要花6年?在最后一行,您有$ ubrpath。那是在哪儿?
D-Klotz'2

1
@ D-Klotz,谢谢,应该改为$ rpath,而该路径又设置为存储库路径。<BR/>对不起一今年年底
BV。

1

不,忽略仅用于添加文件。
您可以使用稀疏签出(如果使用svn 1.5)


1

正如其他一些人提到的那样,您可以在签出时仅使用svn:externals属性,然后使用--ignore-externals选项。有一点要注意,然而,就是SVN:外部组件并没有必然需要参考其他资料库。它可以引用同一仓库中的其他文件夹。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.