关于版本控制:如何忽略SVN目录?

How do I ignore a directory with SVN?

我刚开始使用SVN,我有一个缓存目录,在源代码控制下我不需要它。如何使用svn忽略整个目录/文件夹?

我在OS X和命令行上使用版本和textmate。


设置父目录的svn:ignore属性:

1
svn propset svn:ignore dirname .

如果要忽略多个内容,请在属性值中用换行符分隔。在这种情况下,使用外部编辑器更容易编辑属性值:

1
svn propedit svn:ignore .


下面是一个目录结构示例:

1
2
3
4
\project
    \source
    \cache
    \other

当在project中时,您会看到您的缓存目录没有被添加并显示出来。

1
2
3
> svn st
M  source
?  cache

要设置忽略属性,请执行

svn propset svn:ignore cache .

其中svn:ignore是要设置的属性的名称,cache是该属性的值,.是要设置该属性的目录。它应该是需要该属性的cache目录的父目录。

要检查设置了哪些属性:

1
2
3
> svn proplist
Properties on '.':
  svn:ignore

查看svn:ignore的值:

1
2
> svn propget svn:ignore
cache

要删除以前设置的属性:

1
svn propdel svn:ignore


重要提示:

在你不能使用的命令行上

1
svn add *

这也会添加被忽略的文件,因为命令行扩展了*,因此svn add认为您希望添加所有文件。因此,请使用以下方法:

1
svn add --force .


由于我花了一段时间试图让它工作,应该注意的是,如果SVN中已经存在这些文件,那么需要对它们执行svn delete,然后编辑svn:ignore属性。

我知道这似乎很明显,但他们一直出现在我的svn status列表中,当时我以为它只会在本地忽略他们。


要稍微展开,如果使用svn命令行工具执行此操作,则需要键入:

1
svn propedit svn:ignore path/to/dir

它将打开您选择的文本编辑器,然后键入"*"忽略其中的所有内容,并保存+退出-这将在SVN中包含目录本身,但忽略其中的所有文件,忽略目录,使用父目录的路径,然后在文件中键入目录的名称。保存后,运行更新("svn up"),然后签入适当的路径。


在父目录上设置svn:ignore属性:

1
2
$ cd parentdir
$ svn ps svn:ignore . 'cachedir'

这将覆盖EDOCX1的任何当前值〔0〕。编辑值时使用:

1
$ svn pe svn:ignore .

这将打开您的编辑器。您可以添加多个模式,每行一个。

可以使用以下选项查看当前值:

1
$ svn pg svn:ignore .

如果您使用的是GUI,那么应该有一个菜单选项来执行此操作。


感谢以上所有贡献。我只想分享一些额外的信息,从我的经验,而忽略文件。

当文件夹已受修订控制时

在SVN导入和SVN合并文件之后,我们通常会第一次这样做。

所有运行时缓存、附件文件夹都将受版本控制。所以,在svn ps svn:ignore之前,我们需要从存储库中删除它。

使用上面的SVN版本1.5,我们可以使用svn del --keep-local your_folder,但对于早期版本,我的解决方案是:

  • SVN导出文件夹的干净副本(不带.svn隐藏文件夹)
  • SVN del本地和存储库,
  • 猿猴病毒
  • 复制回文件夹
  • 是否SVN ST并确认文件夹标记为"?"
  • 现在我们可以根据解决方案进行SVN PS
  • 当我们需要忽略多个文件夹时

    • 在一个目录中,我有两个文件夹需要设置为svn:ignore
    • 如果我们设置一个,另一个将被移除。
    • 那么我们想知道我们需要SVN PE

    svn pe将需要编辑文本文件,如果需要使用vi设置文本编辑器,可以使用此命令:

    1
    export SVN_EDITOR=vi
  • 用"o"你可以打开一条新的线
  • 输入所有要忽略的文件夹名
  • 按"Esc"键退出编辑模式
  • 键入":wq",然后点击enter保存并退出。
  • 该文件看起来很简单:

    1
    2
    3
    4
    runtime
    cache
    attachments
    assets


    先删除它…

    如果您的目录foo已经处于版本控制之下,请先用以下命令删除它:

    1
    svn rm --keep-local foo

    ……然后忽略:

    1
    svn propset svn:ignore foo .

    …如果您想忽略多个目录(例如,build/temp/*.tmp文件),您可以分两步(忽略第一步并编辑忽略属性(请参阅此处的其他答案)或编写类似的内容

    1
    2
    3
    svn propset svn:ignore"build
    temp
    *.tmp" .

    在命令行上。


    如果您使用的是特定的SVN客户机Tortoissesvn,那么在提交时,您可以选择右键单击项目并选择"添加到忽略列表"。


    忽略多个条目的命令有点复杂,需要反斜杠。

    1
    2
    3
    4
    svn propset svn:ignore"cache\
    tmp\
    null\
    and_so_on" .

    此命令将忽略当前目录中名为cachetmpnulland_so_on的任何内容。


    我在让嵌套目录被忽略时遇到问题;我想忽略的顶部目录不会显示为"svn status",但所有的子目录都显示了。这对其他人来说可能是不言而喻的,但我想我会分享它:

    例子:

    /trunk

    /trunk/cache

    /trunk/cache/subdir1

    /trunk/cache/subdir2

    1
    2
    3
    4
    5
    cd /trunk
    svn ps svn:ignore . /cache
    cd /trunk/cache
    svn ps svn:ignore . *
    svn ci

    bash oneliner for multiple忽略:

    1
    2
    3
    svn propset svn:ignore".project"$'
    '".settings"$'
    '".buildpath""yourpath"

    "谢谢"SVN以一种可怕的、虚假的、难以忽略文件的方式。

    所以我写了一个脚本svn忽略所有:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #!/bin/sh

    # svn-ignore-all

    # usage:
    #   1. run svn status to see what is going on at each step
    #   2. add or commit all files that you DO want to have in svn
    #   3. remove any random files that you don't want to svn:ignore
    #   4. run this script to svn:ignore everything marked '?' in output of `svn status`

    svn status |
    grep '^?' |
    sed 's/^? *//' |
    while read f; do
        d=`dirname"$f"`
        b=`basename"$f"`
        ignore=`svn propget svn:ignore"$d"`
        if [ -n"$ignore" ]; then
            ignore="$ignore
    "
        fi
        ignore="$ignore$b"
        svn propset svn:ignore"$ignore""$d"
    done

    另外,为了忽略特定的文件/路径名列表,我们可以使用这个变量svn ignore。我想svn ignore all应该真的像xargs svn ignore。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/bin/sh

    # svn-ignore

    # usage:
    #   svn-ignore file/to/ignore ...

    for f; do
        d=`dirname"$f"`
        b=`basename"$f"`
        ignore=`svn propget svn:ignore"$d"`
        if [ -n"$ignore" ]; then
            ignore="$ignore
    "
        fi
        ignore="$ignore$b"
        svn propset svn:ignore"$ignore""$d"
    done

    还有一件事:我倾向于用许多随机文件来污染我的SVN签出。当需要提交时,我将这些文件移动到"old"子目录中,并告诉SVN忽略"old"。


    要保留SVN将忽略的目录,请执行以下操作:

  • 这将从存储库中删除文件,但将目录保持在SVN控制下:
  • svn delete --keep-local path/directory_to_keep/*

  • 然后设置为忽略目录(和所有内容):
  • svn propset svn:ignore"*" path/directory_to_keep


    杰森的回答会成功的。但是,如果缓存目录不总是存在,您可能希望在父目录的svn:ignore属性中包含"cache",而不是在缓存目录上将svn:ignore设置为"."。我在许多"一次性"文件夹上执行此操作。


    如果项目目录名为/project,而缓存目录名为/project/cache,则需要在/project上设置Subversion属性。属性名应为"svn:ignore",属性值应为"cache"。

    有关属性的详细信息,请参阅Subversion手册中的此页。


    如果您使用的是前端的SVN,比如Tortoissesvn,或者某种类型的IDE集成,那么在同一个菜单中也应该有一个ignore选项,就像commit/add操作一样。


    由于您使用的是版本,所以实际上非常简单:

    • 浏览已签出的副本
    • 单击要忽略的目录
    • 在"忽略"框中单击鼠标右键"编辑"
    • 键入*.*忽略所有文件(或仅对JPG文件键入*.JPG等)


    注意你后面的斜杠。我发现在我的忽略设置文件中包括images/*并没有忽略./images/。当我运行svn status -u时,它仍然显示? images。所以,我只是把忽略设置改为只使用images,不使用斜线。运行了一个状态检查,并将其清除。


    用Eclipse解决了以下问题:

    首先,将文件夹与项目同步:

    team -> synchronise

    在下一个视图(团队视图)中,可以看到可以提交到SVN服务器的所有资源。

    因此,选择要忽略的资源的资源文件夹,然后可以使用

    team -> add to svn:ignore.

    然后,在确认窗口中,选择第一个选项:"按名称忽略"。

    例如,如果我想忽略目标文件夹及其.class资源,我将进行同步,并在"同步"视图中选择目标文件夹。之后,我会选择

    team->add

    svn:ignore,然后我将在确认窗口中确认第一个选项。


    设置svn:ignore属性。大多数UI SVN工具都有一种方法可以做到这一点,以及链接中的命令行讨论。


    在花了很多时间寻找如何做这个简单的活动后,我决定张贴一个不难找到一个像样的解释。

    首先让样本结构

    斯旺斯街?项目/干线/目标?项目/trunk/myfile.x

    1–首先在mycase vim中配置编辑器导出svn_editor=vim

    2–"svn propedit svn:ignore project/trunk/"将打开一个新文件,您可以在美国的情况下添加文件和子目录键入"target"保存并关闭文件并工作

    斯旺斯街?项目/trunk/myfile.x

    谢谢。