如何在Subversion中忽略文件?


645

如何在Subversion中忽略文件?

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


很高兴看到每个简单的问题(可能来自git用户)如何意味着许多过于复杂的答案。如果发生这种情况,那就是Subversion宝贝。
Valerio Bozz

Answers:


738

(此答案已更新,以匹配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
    • 视窗(基于注册表) - Software\Tigris.org\Subversion\Config\Miscellany\global-ignores在这两个HKLMHKCU
    • Linux / Unix- ~/.subversion/config

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

  • 这存储在存储库中,因此其他用户将具有相同的忽略文件。类似于.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以覆盖子目录和子目录中的目录。
  • 我注意到命令行语法是违反直觉的。

    • 我开始假设您将通过键入如下内容来忽略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将隐藏被忽略的文件(即,与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

ta-da!


6
要查找被忽略的文件:svn status -u -v --no-ignore | grep“ ^ I” | awk“ {print \ $ 2}”
Christian Madsen 2010年

3
如果要忽略文件./FolderA/FolderB/FileToIgnore,请从中执行此操作。文件夹:SVN propset命令的svn:忽略“FileToIgnore” FolderA / FolderB中/
JNJ

8
如果正在ssh'ing svn propedit svn:ignore .并且未配置任何文本编辑器,则会收到一条错误消息,显示svn:E205007:没有设置任何环境变量SVN_EDITOR,VISUAL或EDITOR,并且未设置任何“ editor-cmd”运行时配置选项找到而不是打开编辑器。因此,只需像这样指定--editor-cmd nanosvn propedit svn:ignore . --editor-cmd nano
Jonathan

12
您也可以使用“ --recursive”自变量忽略所有子文件夹中具有特定文件名的文件。即svn propset svn:ignore“ * .jpg”。--recursive
圣殿骑士

2
grep是awk的一种更简单替代方法:svn status | grep '^?'
Johnride

91

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

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

2
真好 有一个小的改进svn status | awk "/^?/ {print \$2}" > ignoring.txt
Dirk Eddelbuettel 2014年

4
为什么要删除文件?如果您需要重新创建/添加/删除
请将

请注意,此解决方案将不会忽略子目录中的文件(即使它们显示在ignoring.txt中)。
shaneb '17

那会保留现有的忽略吗?如果不是,如何在一个命令中做到这一点(即--no-ignores并同时保留I开头的行)?
a1an

这将覆盖您当前的忽略项,请尝试:svn pg svn:ignore . >> ignore.txt在将当前忽略项附加到文件的第一个命令之后。
ulitosCoder

54

.gitignore喜欢的方法

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

svn propset svn:ignore -F ignorelist.txt .

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

svn propset svn:ignore "first
 second
 third" .

来源:Karsten的博客-从命令行为多个文件设置svn:ignore


1
请注意,如果您稍后修改忽略的文件,你需要重新运行该svn:ignore命令(见stackoverflow.com/a/58380306/189518
老师詹姆斯

50

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

svn:ignore检入文件时将选中,匹配的文件将被忽略。对于Visual Studio .NET项目,我具有以下忽略列表:

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

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


26

似乎没有人提到它...

svn propedit svn:ignore .

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


3
这个答案很有用。就我而言,我需要更改“。” 到我想忽略的文件的子目录,仅指定文件模式。另外,第一次,我需要运行此命令(在Mac上为Mac):export SVN_EDITOR =“ nano”
Elijah Lofgren

22

我找到了.svnignore示例Java文章 。

范例:.svnignore for Ruby on Rails,

/log

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

*.*~

在那之后:

svn propset svn:ignore -F .svnignore .

.gitignore的示例。您可以将.svnignore用于

https://github.com/github/gitignore


1
我按照你说的做了...但是当我运行svn status时。它仍然显示带有“?”的被忽略文件
Harshit Gupta 2014年

我从来没有检查过svn的状态,但是使用了svn add *,在执行svn commit之后,忽略文件不会被提交。
d.danailov 2014年

如果文件“ a.txt”已经在版本控制中,那么忽略是通过“ svn propset svn:ignore -F .svnignore a.txt”之类的命令完成的?这是对的吗 ?
errakeshpd 2014年

如果您在.svnignore文件中添加“ a.txt”,则不能确定,但​​是命令应该正确。
d.danailov 2014年

10

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

如果您已经在Linux上使用tab-autocomplete来创建文件,这些文件将自动插入:

svn propset svn:ignore 'file1
file2' .

6
这仅适用于某些shell,例如bash。请注意,重新发出propset命令将覆盖之前的一组模式。
JA Faucett 2012年

因此,file1file2必须位于单独的行上吗?
IgorGanapolsky

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

8

另外,如果您使用Tortoise SVN,则可以执行以下操作:

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

6
  1. cd〜/ .subversion
  2. 打开配置
  3. 找到像“ global-ignores”这样的行
  4. 集忽略文件类型是这样的:全球忽略= *的.o * .LO * .la * .al的.libs *。所以。。所以[0-9] * * pyc文件88 .pyo *名为.rej 〜# #。#*。*。swp .DS_Store node_modules输出

谢谢,您的答案是唯一提到该config文件的答案。
亨里克·德·索萨

此答案还提到了它@HenriquedeSousa stackoverflow.com/a/86052/7724,还说明了这是忽略文件的仅本地客户端方式。
bzlm

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

我喜欢bkbilly的答案,但是此版本中断每一行以使其更具可读性,并删除了&&在我的测试中没有执行任何操作,因为第一行始终创建临时文件,并且该临时文件始终进入忽略列表。
LivingDust '16

在这种情况下,编辑建议会更合适。感谢您的努力!
吉姆(Jim)

我没有足够的声誉来建议编辑。但我不想破坏一个好的协议。是否有关于指南的简单自述文件,建议何时进行编辑和建议而不是发布新答案等更好?
LivingDust

1
如果您的答案与一年半前发布的答案完全相同,那就很简单了。您甚至复制了“ 它做什么 ”的说明。
吉姆(Jim)


3

svn status 会告诉您哪些文件不在SVN中,以及发生了什么更改。

查看SVN属性中的ignore属性。

对于SVN,需要阅读《红皮书》




2

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

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

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

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

我们对SVN管理源代码Comparetrap成功地使用这种方法


2

对我有用的是:

如何在Subversion中忽略文件?
1.在文件资源管理器中,右键单击SVN项目的文件夹名称
2.单击“ SVN提交...”
3.将出现“提交”窗口
4.右键单击要忽略的文件夹/文件
5.单击“添加以忽略列表”。6.
选择文件夹/文件
。7.将“属性更改”提交给SVN

另外,如何查找不受版本控制的文件?
完成上述步骤3之后,点击“显示未版本化的文件”


0
  1. 打开您使用的JetBrains产品(即Pycharm)
  2. 然后点击顶部工具栏上的“提交”按钮,或使用快捷键“ ctrl + k” screenshot_toolbar
  3. 在提交界面上,将不需要的文件移动到另一个更改列表,如下所示。 screenshot_commit_change
  4. 下次您只能提交默认更改列表。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.