【问题标题】:How do I ignore a directory with SVN?如何使用 SVN 忽略目录?
【发布时间】:2010-09-12 01:53:05
【问题描述】:

我刚开始使用 SVN,并且我有一个在源代码管理下不需要的缓存目录。如何使用 SVN 忽略整个目录/文件夹?

我在 OS X 和命令行上使用 VersionsTextMate

【问题讨论】:

标签: svn version-control directory


【解决方案1】:

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

svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .

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

【讨论】:

  • 并且澄清一下:这里的反斜杠不是svn的特性;它只是一种在 shell 上输入多行字符串的方法。你也可以使用编辑器,只写多行。
  • bash 不需要反斜杠。 bash 足够聪明,知道 " 是打开的,而不是处理该行。您需要做的就是在缓存、tmp 和 null 之后按 enter。您将看到 bash 将提示更改为 >,以便您了解您仍在输入命令。另一种方法是开始输入命令(svn),然后按 esc 然后按 v。这将允许您在编辑器中输入命令。完成后按 ZZ 执行命令。如果您改变主意并且不想执行,那么 :q!.
  • svn propset svn:ignore -F .ignorethesefiles . 将允许您使用文件。如前所述,你总是有propedit。
【解决方案2】:

Eclipse解决下一个方法:

首先,将你的文件夹同步到项目中:

团队 -> 同步

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

所以,选择你要忽略的资源所在的资源文件夹,然后就可以使用忽略它了

团队 -> 添加到svn:ignore

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

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

团队->添加

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

【讨论】:

    【解决方案3】:

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


    当文件夹已经处于修订控制之下时

    svn importsvn co文件之后,我们通常第一次做的事情。

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

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

    1. svn export一个干净的文件夹副本(没有.svn隐藏文件夹)
    2. svn del 本地和存储库,
    3. svn ci
    4. 复制文件夹
    5. 执行 svn st 并确认文件夹标记为“?”
    6. 现在我们可以根据解决方案svn ps

    当我们需要忽略多个文件夹时

    • 在一个目录中我有两个文件夹需要设置为svn:ignore
    • 如果我们设置一个,另一个将被删除。
    • 然后我们想知道我们需要 svn pe

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

    export SVN_EDITOR=vi
    
    1. 使用“o”可以打开一个新行
    2. 输入您要忽略的所有文件夹名称
    3. 按“esc”键退出编辑模式
    4. 输入 ":wq" 然后按 Enter 保存并退出

    文件看起来像这样:

    runtime
    cache
    attachments
    assets
    

    【讨论】:

    • 你也可以使用svn propset svn:ignore -F .ignorethesefiles .,它将使用文件的内容。我喜欢保留它,这样你就知道什么被忽略了。编辑需要后续道具。
    【解决方案4】:

    针对多次忽略的 Bash oneliner:

    svn propset svn:ignore ".project"$'\n'".settings"$'\n'".buildpath" "yourpath"
    

    【讨论】:

    • 由于$'somestring' 表示带有转义序列的字符串文字,您可以将其写成更短更简单的svn propset svn:ignore $'.project\n.settings\n.buildpath' "yourpath"
    【解决方案5】:

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

    我知道这似乎很明显,但是当我认为它只会在本地忽略它们时,它们一直在我的 svn status 列表中显示为 ?

    【讨论】:

    • 如果您只想忽略它们而不是实际删除它们,请不要忘记在删除文件时使用 --keep-local 选项。
    【解决方案6】:

    重要提示:

    在命令行你不能使用

    svn add *
    

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

    svn add --force .
    

    【讨论】:

    • 完全按照@binco 所说的那样做:svn add --force * 不会工作。使用圆点,而不是星号。
    【解决方案7】:

    这是一个示例目录结构:

    \project
        \source
        \cache
        \other
    

    当您在project 中时,您会看到您的缓存目录未添加并显示为这样。

    > svn st
    M  source
    ?  cache
    

    要设置忽略属性,请执行以下操作

    svn propset svn:忽略缓存。

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

    检查设置了哪些属性:

    > svn proplist
    Properties on '.':
      svn:ignore
    

    查看svn:ignore的值:

    > svn propget svn:ignore
    cache
    

    删除之前设置的属性:

    svn propdel svn:ignore
    

    【讨论】:

    • 我偶然发现了一个棘手的问题。确保dirname 中添加斜杠。例如,当输入 svn propset svn:ignore dirname 时,如果您允许 (bash) shell 为您填写目录名,它将添加该斜杠,给您留下命令 svn propset svn:ignore dirname/,这不会导致文件夹忽略。至少,这是我的经验。
    • “缓存”目录仍将列在“svn st”中。有没有办法从视图中删除它? (不从磁盘中删除)
    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

      保留 SVN 将忽略的目录:

      1. 这将从存储库中删除文件,但将目录保留在 SVN 控制之下:

      svn delete --keep-local path/directory_to_keep/*

      1. 然后设置为忽略目录(和所有内容):

      svn propset svn:ignore "*" path/directory_to_keep

      【讨论】:

        【解决方案10】:

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

        svn propset svn:ignore dirname .
        

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

        svn propedit svn:ignore .
        

        【讨论】:

        • @Kouber:您的问题是外壳扩展不知道 svn:ignore 属性。所以使用'*'作为参数explicityl 将tmp 传递给commit 命令。尝试类似 'svn commit -m "更多口音" 。'
        • 感谢您的回答。 Pico 作为编辑器: svn propedit svn:ignore 。 --editor-cmd pico
        • 注意:如果目录已经在 svn 中,这将不起作用。 svn rm --keep-local dirname 首先。 (我的 svn stat 输出非常大,我把头撞了一会儿。)
        • 如果您想忽略多个文件/文件夹,请将它们的所有名称添加到一个 txt 文件中,每行一行,并使用以下变体:svn propset svn:ignore -F file.txt .
        • 确保检查是否已经存在被忽略的路径,svn propget svn:ignoresvn propset svn:ignore dirname . 将覆盖当前被忽略的路径。最好使用svn propedit svn:ignore .。如果您已经覆盖了 svn:ignore,请使用 svn proplist -v <PATH>|<URL> 获取特定路径的当前值,然后通过复制/粘贴到 svn propedit svn:ignore . 来恢复它。
        【解决方案11】:

        在花费大量时间寻找如何进行这个简单的活动之后,我决定发布它并不难找到一个体面的解释。

        先让样本结构

        $ svn st ?项目/主干/目标 ?项目/主干/myfile.x

        1 - 首先配置编辑器,在 mycase vim 中 导出 SVN_EDITOR=vim

        2 – “svn propedit svn:ignore project/trunk/” 将打开一个新文件,您可以在我们的案例中添加您的文件和子目录,输入“target”保存并关闭文件并运行

        $ svn st ?项目/主干/myfile.x

        谢谢。

        【讨论】:

          【解决方案12】:

          “谢谢你” svn 以这种可怕、虚假和困难的方式忽略文件。

          于是我写了一个脚本svn-ignore-all:

          #!/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。

          #!/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 结帐。当需要提交时,我将这些文件移动到“旧”子目录中,并告诉 svn 忽略“旧”。

          【讨论】:

          • 嘿山姆,这是一个不错的脚本。我的脑海中突然出现了一个问题:问题是否可能来自这样一个事实,即忽略作为存储库一部分的整个文件夹不起作用,所以我们最终得到了那些“?”哪些文件基本上是我们添加到忽略列表中的文件夹中的修改文件?我只是想知道是否有办法绕过您的脚本,因为一直运行它会很乏味。你呢?
          • 不,我真的不使用它!试着清理我的文件
          【解决方案13】:

          先删除...

          如果您的目录 foo 已经在版本控制下,请先将其删除:

          svn rm --keep-local foo
          

          ...然后忽略:

          svn propset svn:ignore foo .
          

          【讨论】:

            【解决方案14】:

            也要注意尾部的斜线。我发现在我的忽略设置文件中包含images/* 并没有忽略./images/。当我运行svn status -u 时,它仍然显示? images。所以,我只是将忽略设置更改为 images,没有斜杠。运行状态检查并将其清除。

            【讨论】:

              【解决方案15】:

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

              • 浏览您的签出副本
              • 点击要忽略的目录
              • 在右侧的“忽略”框中单击编辑
              • 输入 *.* 忽略所有文件(或 *.jpg 仅表示 jpg 文件等)

              【讨论】:

                【解决方案16】:

                ...如果您想忽略多个目录(例如 build/ temp/*.tmp 文件),您可以分两步完成(忽略第一个并编辑忽略属性(参见其他答案在这里)或者可以写类似的东西

                svn propset svn:ignore "build
                temp
                *.tmp" .
                

                在命令行上。

                【讨论】:

                  【解决方案17】:

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

                  示例:

                  /主干

                  /主干/缓存

                  /trunk/cache/subdir1

                  /trunk/cache/subdir2

                  cd /trunk
                  svn ps svn:ignore . /cache
                  cd /trunk/cache
                  svn ps svn:ignore . *
                  svn ci
                  

                  【讨论】:

                    【解决方案18】:

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

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

                    这将覆盖svn:ignore 的任何当前值。您可以通过以下方式编辑值:

                    $ svn pe svn:ignore .
                    

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

                    您可以通过以下方式查看当前值:

                    $ svn pg svn:ignore .
                    

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

                    【讨论】:

                    • svn ps svn:ignore . 'cachedir' 结果为cachedir is not under version control。更改为 svn ps svn:ignore 'cachedir' . 为我工作
                    【解决方案19】:

                    杰森的回答可以解决问题。但是,不是将 svn:ignore 设置为 "."在缓存目录上,您可能希望在 parent 目录的 svn:ignore 属性中包含“缓存”,以防缓存目录并不总是存在。我在许多“一次性”文件夹上执行此操作。

                    【讨论】:

                      【解决方案20】:

                      如果您的项目目录名为/Project,并且您的缓存目录名为/Project/Cache,那么您需要在/Project 上设置一个subversion 属性。属性名称应为“svn:ignore”,属性值应为“Cache”。

                      有关属性的更多信息,请参阅 Subversion 手册中的 this 页面。

                      【讨论】:

                        【解决方案21】:

                        如果您使用的是像 TortoiseSVN 这样的 SVN 前端,或某种 IDE 集成,在提交/添加操作的同一菜单中也应该有一个忽略选项。

                        【讨论】:

                          【解决方案22】:

                          稍微扩展一下,如果你使用 svn 命令行工具来做这个,你想输入:

                          svn propedit svn:ignore path/to/dir
                          

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

                          【讨论】:

                          • 非常好,谢谢。所有其他答案都错过了嵌套目录的情况。所以上面的例子(工作)然后你输入编辑器被忽略的目录(假设是路径/到/目录下一级)。但这不起作用: svn propedit svn:ignore 。然后在编辑器中输入 path/to/dir/ignored_directory 。 IOW:SVN 一次匹配下一级的对象。
                          【解决方案23】:

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

                          【讨论】:

                            猜你喜欢
                            • 2020-05-05
                            • 2014-09-24
                            • 2011-10-12
                            • 1970-01-01
                            • 1970-01-01
                            • 2011-01-03
                            • 1970-01-01
                            • 1970-01-01
                            • 2013-02-28
                            相关资源
                            最近更新 更多