【问题标题】:How do I ignore files in Subversion?如何忽略 Subversion 中的文件?
【发布时间】:2010-09-10 07:20:58
【问题描述】:

如何在 Subversion 中忽略文件?

另外,我如何找到不受版本控制的文件?

【问题讨论】:

    标签: svn command


    【解决方案1】:

    (此答案已更新以匹配 SVN 1.8 和 1.9 的行为)

    您有 2 个问题:

    将文件标记为已忽略:

    “忽略文件”是指该文件不会出现在列表中,即使是“未版本化”:您的 SVN 客户端会假装该文件在文件系统中根本不存在。

    忽略的文件由“文件模式”指定。 SVN 的在线文档中解释了文件模式的语法和格式:http://svnbook.red-bean.com/nightly/en/svn.advanced.props.special.ignore.html“Subversion 中的文件模式”。

    从 1.8 版(2013 年 6 月)及更高版本开始,Subversion 支持 3 种不同的指定文件模式的方式。以下是带有示例的摘要:

    1 - 运行时配置区 - global-ignores 选项:

    • 这是仅限客户端设置,因此您的global-ignores 列表不会被其他用户共享,它适用于您在计算机上结帐的所有存储库。
    • 此设置在您的运行时配置区域文件中定义:
      • Windows(基于文件)-C:\Users\{you}\AppData\Roaming\Subversion\config
      • Windows(基于注册表)-Software\Tigris.org\Subversion\Config\Miscellany\global-ignoresHKLMHKCU 中。
      • Linux/Unix - ~/.subversion/config

    2 - svn:ignore 属性,在目录(不是文件)上设置:

    • 这存储在 repo 中,因此其他用户将拥有相同的忽略文件。类似于 .gitignore 的工作原理。
    • svn:ignore 应用于目录并且是非递归的或继承的。任何与文件模式匹配的父目录的文件或 immediate 子目录都将被排除。
    • 虽然 SVN 1.8 添加了“继承属性”的概念,但 svn:ignore 属性本身在非直接后代目录中会被忽略:

      cd ~/myRepoRoot                             # Open an existing repo.
      echo "foo" > "ignoreThis.txt"                # Create a file called "ignoreThis.txt".
      
      svn status                                  # Check to see if the file is ignored or not.
      > ?    ./ignoreThis.txt
      > 1 unversioned file                        # ...it is NOT currently ignored.
      
      svn propset svn:ignore "ignoreThis.txt" .   # Apply the svn:ignore property to the "myRepoRoot" directory.
      svn status
      > 0 unversioned files                       # ...but now the file is ignored!
      
      cd subdirectory                             # now open a subdirectory.
      echo "foo" > "ignoreThis.txt"                # create another file named "ignoreThis.txt".
      
      svn status
      > ?    ./subdirectory/ignoreThis.txt        # ...and is is NOT ignored!
      > 1 unversioned file
      

      (因此文件./subdirectory/ignoreThis 不会被忽略,即使在. 存储库根上应用了“ignoreThis.txt”)。

    • 因此,要递归应用忽略列表,您必须使用svn propset svn:ignore <filePattern> . --recursive

      • 这将在每个子目录上创建该属性的副本。
      • 如果子目录中的<filePattern> 值不同,则子目录的值会完全覆盖父目录,因此不会产生“加法”效应。
      • 因此,如果您更改根 . 上的 <filePattern>,那么您必须使用 --recursive 更改它以覆盖子目录和后代目录上的它。
    • 我注意到命令行语法是违反直觉的。

      • 我一开始假设您会通过键入 svn ignore pathToFileToIgnore.txt 之类的内容来忽略 SVN 中的文件,但这不是 SVN 的忽略功能的工作方式。

    3- svn:global-ignores 属性。需要 SVN 1.8(2013 年 6 月):

    • 这类似于svn:ignore,不同之处在于它利用了SVN 1.8 的“继承属性”功能。
    • svn:ignore 相比,文件模式会自动应用于每个后代目录(不仅仅是直接子目录)。
      • 这意味着无需使用 --recursive 标志设置 svn:global-ignores,因为继承的忽略文件模式会在继承时自动应用。
    • 运行与上一个示例相同的命令集,但使用 svn:global-ignores 代替:

      cd ~/myRepoRoot                                    # Open an existing repo
      echo "foo" > "ignoreThis.txt"                       # Create a file called "ignoreThis.txt"
      svn status                                         # Check to see if the file is ignored or not
      > ?    ./ignoreThis.txt
      > 1 unversioned file                               # ...it is NOT currently ignored
      
      svn propset svn:global-ignores "ignoreThis.txt" .
      svn status
      > 0 unversioned files                              # ...but now the file is ignored!
      
      cd subdirectory                                    # now open a subdirectory
      echo "foo" > "ignoreThis.txt"                       # create another file named "ignoreThis.txt"
      svn status
      > 0 unversioned files                              # the file is ignored here too!
      

    对于 TortoiseSVN 用户:

    这整个安排让我感到困惑,因为 TortoiseSVN 的术语(在他们的 Windows 资源管理器菜单系统中使用)最初误导了我 - 我不确定忽略菜单的“递归添加”、“添加 *”和“添加”选项。我希望这篇文章解释了忽略功能如何与 SVN 属性功能相关联。也就是说,我建议使用命令行来设置被忽略的文件,以便您了解它是如何工作的,而不是使用 GUI,并且仅在您熟悉命令行后才使用 GUI 来操作属性。

    列出被忽略的文件:

    svn status 命令将隐藏被忽略的文件(即匹配 RGA global-ignores 模式的文件,或匹配直接父目录的 svn:ignore 模式或匹配任何祖先目录的 svn:global-ignores 模式的文件。

    使用--no-ignore 选项查看列出的这些文件。忽略的文件的状态为I,然后将输出通过管道传输到grep,以仅显示以“I”开头的行。

    命令是:

    svn status --no-ignore | grep "^I"
    

    例如:

    svn status
    > ? foo                             # An unversioned file
    > M modifiedFile.txt                # A versioned file that has been modified
    
    svn status --no-ignore
    > ? foo                             # An unversioned file
    > I ignoreThis.txt                  # A file matching an svn:ignore pattern
    > M modifiedFile.txt                # A versioned file that has been modified
    
    svn status --no-ignore | grep "^I"
    > I ignoreThis.txt                  # A file matching an svn:ignore pattern
    

    哒哒!

    【讨论】:

    • 查找被忽略的文件:svn status -u -v --no-ignore |grep "^I"|awk "{print \$2}"
    • 如果您想忽略文件 ./FolderA/FolderB/FileToIgnore,请从您的 .文件夹:svn propset svn:ignore "FileToIgnore" FolderA/FolderB/
    • 如果你在 ssh'ing svn propedit svn:ignore . 并且没有配置文本编辑器,你会收到一条错误消息,说 svn: E205007: 没有设置环境变量 SVN_EDITOR、VISUAL 或 EDITOR ,并且没有找到“editor-cmd”运行时配置选项,而不是打开编辑器。所以只需像这样指定 --editor-cmd nano svn propedit svn:ignore . --editor-cmd nano
    • 您还可以使用“--recursive”参数忽略所有子文件夹中具有特定文件名的文件。即 svn propset svn:ignore "*.jpg" 。 --递归
    • awk 的一个更简单的替代方法是 grep:svn status | grep '^?'
    【解决方案2】:

    使用以下命令创建不在版本控制文件下的列表。

    svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt
    

    然后编辑文件以只保留您实际上要忽略的文件。然后用这个忽略文件中列出的文件:

    svn propset svn:ignore -F ignoring.txt .
    

    注意行尾的点。它告诉 SVN 该属性正在当前目录中设置。

    删除文件:

    rm ignoring.txt
    

    最后提交,

    svn ci --message "ignoring some files"
    

    然后您可以通过以下方式检查哪些文件被忽略:

    svn proplist -v
    

    【讨论】:

    • 不错。一个小的改进是svn status | awk "/^?/ {print \$2}" > ignoring.txt
    • 为什么要删除文件?如果您需要重新创建/添加/删除,请将其保存在仓库中
    • 请注意,此解决方案不会忽略子目录中的文件(即使它们出现在 ignoring.txt 中)。
    • 这会保留现有的忽略吗?如果没有,如何在一个命令中执行(即 --no-ignores 并保留 I 前面的行)?
    • 这将覆盖您当前的忽略,请尝试:svn pg svn:ignore . >> ignore.txt 在第一个命令之后将当前忽略附加到文件。
    【解决方案3】:

    .gitignore 之类的方法

    您可以忽略 .gitignore 之类的文件或目录。只需创建要忽略的目录/文件列表的文本文件并运行以下代码:

    svn propset svn:ignore -F ignorelist.txt .
    

    或者如果你不想使用文本文件,你可以这样做:

    svn propset svn:ignore "first
     second
     third" .
    

    Source: Karsten's Blog - Set svn:ignore for multiple files from command line

    【讨论】:

    【解决方案4】:

    如果您使用TortoiseSVN,请右键单击文件,然后选择TortoiseSVN / 添加到忽略列表。这会将文件/通配符添加到 svn:ignore 属性中。

    svn:ignore 将在您签入文件时被检查,匹配的文件将被忽略。我有以下 Visual Studio .NET 项目的忽略列表:

    bin obj
    *.exe
    *.dll
    _ReSharper
    *.pdb
    *.suo
    

    您可以在 TortoiseSVN / Properties 的上下文菜单中找到此列表。

    【讨论】:

      【解决方案5】:

      似乎没有人提到它......

      svn propedit svn:ignore .
      

      然后编辑文件的内容以指定要忽略的模式,退出编辑器就完成了。

      【讨论】:

      • 这个答案很有用。就我而言,我需要更改“。”到我想忽略的文件的子目录,只需指定文件模式。另外,第一次,我需要运行这个(我在 Mac 上):export SVN_EDITOR="nano"
      【解决方案6】:

      我找到了这篇文章.svnignore Example for Java

      示例:用于 Ruby on Rails 的 .svnignore,

      /log
      
      /public/*.JPEG
      /public/*.jpeg
      /public/*.png
      /public/*.gif
      
      *.*~
      

      然后:

      svn propset svn:ignore -F .svnignore .
      

      .gitignore 的示例。您可以为您的 .svnignore 使用

      https://github.com/github/gitignore

      【讨论】:

      • 我按照你说的做了……但是当我运行 svn 状态时。它仍然用“?”显示被忽略的文件
      • 我从未检查过 svn 状态,但使用 svn add * 并且在 svn 提交之后,忽略文件不会提交。
      • 如果一个文件 "a.txt" 已经在版本控制中,那么忽略是通过像 "svn propset svn:ignore -F .svnignore a.txt" 这样的命令来完成的?对吗?
      • 如果你在你的 .svnignore 文件中添加“a.txt”,我不确定,但命令应该是正确的。
      【解决方案7】:

      使用 propedit 时,请确保没有任何尾随空格,因为这会导致文件从忽略列表中排除。

      如果您在 linux 上使用 tab-autocomplete 来创建开头的文件,这些会自动插入:

      svn propset svn:ignore 'file1
      file2' .
      

      【讨论】:

      • 这仅适用于某些 shell,例如 bash。请注意,重新发出 propset 命令会覆盖之前的一组模式。
      • 所以 file1file2 必须在不同的行上?
      【解决方案8】:

      另一种解决方案是:

      svn st | awk '/^?/{print $2}' > svnignore.txt && svn propget svn:ignore >> svnignore.txt && svn propset svn:ignore -F svnignore.txt . && rm svnignore.txt
      

      或逐行

      svn st | awk '/^?/{print $2}' > svnignore.txt 
      svn propget svn:ignore >> svnignore.txt 
      svn propset svn:ignore -F svnignore.txt . 
      rm svnignore.txt
      

      它的作用:

      1. 从svn获取状态文件
      2. 将所有带有 ? 的文件保存到文件“svnignore.txt”
      3. 获取已被忽略的文件并将它们附加到文件“svnignore.txt”
      4. 告诉svn忽略“svnignore.txt”中的文件
      5. 删除文件

      【讨论】:

        【解决方案9】:

        另外,如果你使用 Tortoise SVN,你可以这样做:

        1. 在上下文菜单中选择“TortoiseSVN”,然后选择“属性”
        2. 在出现的窗口中点击“新建”,然后点击“高级”
        3. 在“属性名”对面出现的窗口中选择或输入“svn:ignore”,在“属性值”对面输入所需的文件名或文件夹名或文件掩码(在我的情况下是“*/target”),点击“递归应用属性”
        4. 好的。好的。
        5. 提交

        【讨论】:

          【解决方案10】:
          1. cd ~/.subversion
          2. 打开配置
          3. 找到像“global-ignores”这样的行
          4. 设置忽略文件类型如下:global-ignores = *.o *.lo *.la *.al .libs *.so .so.[0-9] *.pyc * .pyo 88 *.rej ~## .#* .*.swp .DS_Store node_modules 输出

          【讨论】:

          • 谢谢,您的回答是唯一提到config文件的回答。
          • 这个答案也提到了它@HenriquedeSousa stackoverflow.com/a/86052/7724 并解释说它是一种本地客户端忽略文件的方式。
          【解决方案11】:

          bkbilly's answer: 更易读的版本

          svn st | awk '/^?/{print $2}' > svnignore.txt
          svn propget svn:ignore >> svnignore.txt
          svn propset svn:ignore -F svnignore.txt .
          rm svnignore.txt
          

          它的作用:

          1. 从svn获取状态文件
          2. 将所有带有 ? 的文件保存到文件“svnignore.txt”
          3. 获取已被忽略的文件并将它们附加到文件“svnignore.txt”
          4. 告诉svn忽略“svnignore.txt”中的文件
          5. 删除文件

          【讨论】:

          • 我喜欢 bkbilly 的回答,但这个版本打破了每一行以使其更具可读性,并删除了 && 在我的测试中什么也没做,因为第一行总是创建临时文件,而这同样是临时文件文件总是进入忽略列表。
          • 在这种情况下,编辑提议会更合适。感谢您的努力!
          • 我还没有足够的声誉来建议编辑。但我不想破坏一个好的协议。是否有关于何时建议和编辑而不是发布新答案等更好的指南的简单自述文件?
          • 如果您的答案与一年半前发布的答案完全相同,那就很简单了。你甚至复制了“它的作用”的解释。
          【解决方案12】:

          什么对我有用我正在使用 TortoiseSVN v1.13.1):

          如何在 Subversion 中忽略文件?

          1.在文件资源管理器中,右键单击 SVN 项目文件夹名称
          2.点击“SVN提交...”
          3.会出现“提交”窗口
          4.右键单击您要忽略的文件夹/文件
          5.点击“添加到忽略列表”
          6.选择要忽略的文件夹/文件名

          • 有几个选择(我有 4 个),如果你只选择文件夹/文件名,它将被添加到 svn:ignore 列表中
          • 如果您选择文件夹/文件名,使用(递归),它将被添加到 svn:global-ignores。这是我通常选择的,因为所有子目录都会自动继承此更改。

          7.提交“属性更改”到 SVN

          另外,我如何找到不受版本控制的文件?

          在上面第3步之后,点击“显示未版本控制的文件”如下:

          【讨论】:

            【解决方案13】:

            您还可以在 SVN 的配置文件中设置全局忽略模式。

            【讨论】:

            • 您可以为特定存储库设置忽略模式吗?
            【解决方案14】:

            svn status 会告诉你哪些文件不在 SVN 中,以及发生了哪些变化。

            查看 SVN properties 的忽略属性。

            对于所有 SVN,Red Book 是必读的。

            【讨论】:

              【解决方案15】:

              Adding a directory to subversion, and ignoring the directory contents

              svn propset svn:ignore '\*.*' .
              

              svn propset svn:ignore '*' .
              

              【讨论】:

                【解决方案16】:

                在工作副本上使用命令 svn status 来显示文件的状态,尚未受版本控制(并且未被忽略)的文件旁边会带有一个问号。

                关于忽略文件,您需要编辑 svn:ignore 属性,请阅读http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.ignore.html svnbook 中的忽略未版本控制项一章。这本书还描述了更多关于使用 svn status 的内容。

                【讨论】:

                  【解决方案17】:

                  SVN ignore 在 TortoiseSVN 中很容易管理。打开 TortoiseSVN 并右键单击文件菜单然后选择添加到忽略列表。

                  这将在svn:ignore 属性中添加文件。 当我们签入文件时,那些与svn:ignore 匹配的文件将被忽略并且不会提交。

                  在 Visual Studio 项目中,我们添加了以下要忽略的文件:

                  bin obj
                  *.exe
                  *.dll
                  *.pdb
                  *.suo
                  

                  我们正在使用此方法成功管理Comparetrap的SVN上的源代码

                  【讨论】:

                    【解决方案18】:
                    1. 打开你使用 JetBrains 产品(即 Pycharm)
                    2. 然后单击顶部工具栏上的“提交”按钮或使用快捷键“ctrl + k” screenshot_toolbar
                    3. 在提交界面上,将不需要的文件移动到另一个更改列表,如下所示。 screenshot_commit_change
                    4. 下次只能提交默认更改列表。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2011-09-02
                      • 1970-01-01
                      • 2020-02-11
                      • 1970-01-01
                      • 2013-11-20
                      • 2012-06-22
                      相关资源
                      最近更新 更多