如何忽略Subversion中的文件?

如何忽略Subversion中的文件?

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


(这个答案已经更新以符合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}AppDataRoamingSubversionconfig
  • Windows(基于注册表) - SoftwareTigris.orgSubversionConfigMiscellanyglobal-ignoresHKLMHKCU
  • 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 ”被应用在.回购根)。

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

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

  • 我开始假设你会忽略SVN中的一个文件,方法是输入类似svn ignore pathToFileToIgnore.txt但这不是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匹配的文件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 | 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
    

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

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

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

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

    链接地址: http://www.djcxy.com/p/37517.html

    上一篇: How do I ignore files in Subversion?

    下一篇: Why is Git better than Subversion?