如何在Subversion中忽略文件?

如何在Subversion中忽略文件?

此外,如何查找不受版本控制的文件?

654951 次浏览

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

你有两个问题:

将文件标记为忽略:

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

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

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

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

  • 这是只对客户端设置,因此您的global-ignores列表不会被其他用户共享,并且它适用于您在计算机上结帐的所有存储库。
  • 此设置在您的运行时配置区域文件中定义:
    • Windows(基于文件)-C:\Users\{you}\AppData\Roaming\Subversion\config
    • Windows(基于注册表)-HKLMHKCU中的Software\Tigris.org\Subversion\Config\Miscellany\global-ignores
    • 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

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

    • 我开始假设您会通过键入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!
    

For TortoiseSVN users:

This whole arrangement was confusing for me, because TortoiseSVN's terminology (as used in their Windows Explorer menu system) was initially misleading to me - I was unsure what the significance of the Ignore menu's "Add recursively", "Add *" and "Add " options. I hope this post explains how the Ignore feature ties-in to the SVN Properties feature. That said, I suggest using the command-line to set ignored files so you get a feel for how it works instead of using the GUI, and only using the GUI to manipulate properties after you're comfortable with the command-line.

Listing files that are ignored:

The command svn status will hide ignored files (that is, files that match an RGA global-ignores pattern, or match an immediate parent directory's svn:ignore pattern or match any ancesor directory's svn:global-ignores pattern.

Use the --no-ignore option to see those files listed. Ignored files have a status of I, then pipe the output to grep to only show lines starting with "I".

The command is:

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会告诉你哪些文件不在SVN中,以及发生了什么变化。

查看SVN属性中的忽略属性。

对于所有SVN,红皮书是必需的。

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

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

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

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

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

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

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

使用propedit时,请确保没有任何尾随空格,因为这将导致文件被排除在忽略列表之外。

如果您在linux上使用tab-自动完成创建文件以开始,这些会自动插入:

svn propset svn:ignore 'file1
file2' .

此外,如果您使用Tortoise SVN,您可以这样做:

  1. 在上下文菜单中选择“TortoiseSVN”,然后选择“属性”
  2. 在出现的窗口中单击“新建”,然后单击“高级”
  3. 在出现的与“属性名称”相反的窗口中选择或键入“svn:忽略”,与“属性值”相反键入所需的文件名或文件夹名称或文件掩码(在我的情况下是“*/目标”),单击“递归应用属性”
  4. 好啦好啦。
  5. 提交

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

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

我找到了文章. svnignoreJava示例

示例: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

. gitignore类似方法

您可以忽略像. gitignore这样的文件或目录。只需创建一个包含要忽略的目录/文件列表的文本文件并运行以下代码:

svn propset svn:ignore -F ignorelist.txt .

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

svn propset svn:ignore "first
second
third" .

来源:Karsten的博客-设置svn:忽略命令行中的多个文件

向subversion添加目录,并忽略目录内容

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

svn propset svn:ignore '*' .

另一种解决方案是:

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. 删除文件

更易读的bkbilly的回答:版本

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. 删除文件
  1. cd~/. subversion
  2. 打开配置
  3. 找到像“全局忽略”这样的行
  4. 设置忽略文件类型,如下所示:全局忽略=*. o*. lo*. la*. al. libs*. so. so.[0-9]*. pyc*. pyo 88*. rej~## . #* . *.swp.DS_Storenode_modules输出

因为似乎没有人提到过…

svn propedit svn:ignore .

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

SVNignore在TortoiseSVN中易于管理。打开TortoiseSVN并右键单击文件菜单,然后选择添加以忽略列表。

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

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

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

我们正在使用此方法成功管理比较陷阱的SVN上的源代码

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

什么工作对我来说(我正在使用TortoiseSVN v1.13.1):

如何在Subversion中忽略文件?

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

  • 有几个选择(4对我来说),如果你只选择文件夹/文件名,它将被添加到svn:忽略列表
  • 如果您选择文件夹/文件名,with(递归地),它将被添加到svn: global-忽略。这是我通常选择的,因为所有子目录都会自动继承此更改。 输入图片描述

7.提交将“属性更改”改为SVN

此外,如何查找不受版本控制的文件?

在上面的第3步之后,单击“显示未版本化的文件”,如下所示:
输入图片描述