小编典典

如何忽略 Subversion 中的文件?

all

如何忽略 Subversion 中的文件?

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


阅读 115

收藏
2022-03-03

共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-ignores和.HKLM``HKCU
    • Linux/Unix -~/.subversion/config

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

  • 这存储在 repo 中,因此其他用户将拥有相同的忽略文件。类似于如何.gitignore工作。
  • svn:ignore应用于目录并且是非递归的或继承的。将排除与文件模式匹配的父目录的任何文件或 直接子目录。
  • 虽然 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” 应用于.repo 根目录)。

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

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

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

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

  • 这类似于svn:ignore,除了它使用 SVN 1.8 的“继承属性”功能。
  • 与 相比svn:ignore,文件模式会自动应用于每个后代目录(不仅仅是直接子目录)。
    • 这意味着不需要设置svn:global-ignores标志--recursive,因为继承的忽略文件模式在继承时会自动应用。
  • 运行与上一个示例相同的命令集,但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将隐藏被忽略的文件(即匹配 RGAglobal- 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

达达!

2022-03-03