如何在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支持三种不同的指定文件模式的方法。以下是摘要及示例:
global-ignores
选项:global-ignores
列表不会被其他用户共享,并且适用于您在计算机上检出的所有repos。C:\Users\{you}\AppData\Roaming\Subversion\config
HKLM
和HKCU
中的Software\Tigris.org\Subversion\Config\Miscellany\global-ignores
~/.subversion/config
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
(因此,即使在根目录应用了“ignoreThis.txt”,文件./subdirectory/ignoreThis也不会被忽略。
因此,要递归地应用忽略列表,必须使用svn propset svn:ignore <filePattern> . --recursive
。
<filePattern>
值与父目录中的不同,则子目录的值完全覆盖父目录的值,因此没有“加法”效果。.
的<filePattern>
,则必须使用--recursive
进行更改,以在子目录和后代目录上覆盖它。我注意到命令行语法是反直觉的。
svn ignore pathToFileToIgnore.txt
之类的内容来忽略SVN中的文件,但是这不是SVN的忽略功能的工作方式。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的术语(如其Windows资源管理器菜单系统中所用)最初让我感到误导 - 我不确定Ignore菜单中“Add recursively”、“Add *”和“Add ”选项的重要性。我希望这篇文章解释了忽略功能是如何与SVN属性功能相关联的。话虽如此,我建议使用命令行设置被忽略的文件,这样您就可以了解它的工作原理,而不是使用GUI,并且只有在熟悉命令行之后才使用GUI来操作属性。
命令svn status
将隐藏被忽略的文件(即与RCA 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
svn status | awk "/^?/ {print \$2}" > ignoring.txt
。 - Dirk Eddelbuettelsvn proplist -v
来检查哪些文件实际上被忽略是有意义的。 - icc97node_modules
文件夹不起作用,我仍然需要在 SVN GUI 中手动设置忽略。 - Lying_cat您可以像使用.gitignore一样忽略文件或目录。只需创建一个文本文件,列出您想要忽略的目录/文件,并运行下面的代码:
svn propset svn:ignore -F ignorelist.txt .
如果您不想使用文本文件,您可以这样做:
svn propset svn:ignore "first
second
third" .
svn:ignore
命令(参见https://dev59.com/Nbbna4cB1Zd3GeqPiuXs#58380306)。 - Sensei Jamessvn:ignore
属性中。svn:ignore
,并且匹配的文件将被忽略。我有一个Visual Studio .NET项目的以下忽略列表:bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo
您可以在TortoiseSVN / 属性上下文菜单中找到此列表。
似乎没有人提到过这一点...
svn propedit svn:ignore .
然后编辑文件内容以指定要忽略的模式,退出编辑器,一切都完成了。
我发现这篇文章:Java中的.svnignore示例。
示例:Ruby on Rails的.svnignore文件,
/log
/public/*.JPEG
/public/*.jpeg
/public/*.png
/public/*.gif
*.*~
之后:
svn propset svn:ignore -F .svnignore .
用于 .gitignore 的示例。你可以将其用于你的 .svnignore
使用propedit时,请确保没有任何尾随空格,否则文件将被排除在忽略列表之外。
如果您最初使用Linux上的tab自动完成功能创建文件,则这些空格会自动插入:
svn propset svn:ignore 'file1
file2' .
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
功能描述:
以下是更易读的版本,参考自bkbilly的答案:
svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt
它的作用:
svn propedit svn:ignore .
,但没有配置文本编辑器,你会收到一个错误消息,提示“_svn: E205007: 没有设置环境变量SVN_EDITOR,VISUAL或EDITOR,并且找不到'editor-cmd'运行时配置选项_”,而不是打开编辑器。因此,只需像这样指定 _--editor-cmd nano_:svn propedit svn:ignore . --editor-cmd nano
。 - Jonathan Morales Vélezsvn status | grep '^?'
。 - Johnride