如何使用SVN忽略目录?


760

我刚刚开始使用SVN,并且有一个缓存目录,该目录在源代码控制下不需要。如何使用SVN忽略整个目录/文件夹?

我在OS X和命令行上使用VersionsTextMate


3
在这里回答了类似的问题[SVN签出忽略文件夹] [1] [1]:stackoverflow.com/questions/192824/svn-checkout-ignore-folder
mloskot 2011年

如何忽略Subversion中的文件的可能重复项 (我不太在乎重复的方向;
两组

Answers:


796

设置svn:ignore父目录的属性:

svn propset svn:ignore dirname .

如果您有许多事情要忽略,请在属性值中用换行符分隔。在这种情况下,使用外部编辑器更容易编辑属性值:

svn propedit svn:ignore .

2
@Kouber:您的问题是shell扩展不了解svn:ignore属性。因此,使用“ *”作为参数,explicityl将tmp传递给commit命令。尝试类似“ svn commit -m“更多口音”。
MarkusSchaber

4
感谢您的回答。皮克(Pico)作为编辑:svn propedit svn:ignore。--editor-CMD微微
HADE

157
注意:如果目录已经在“ svn”中,则此方法将无效。 svn rm --keep-local dirname第一。(我的svn统计数据输出很大,我一阵子撞了一下。)
Erik Aronesty

10
如果要忽略多个文件/文件夹,请将其所有名称添加到txt文件中,每行一个,并使用以下变体:svn propset svn:ignore -F file.txt .
petervaz 2012年

2
小心设置svn:ignore,不要svn::ignore像我一样。您可以设置任意属性,因此后一个属性将被设置为OK,您可以查看和编辑该属性,但这不会使SVN忽略您列出的文件。
理查德·特纳

406

这是示例目录结构:

\project
    \source
    \cache
    \other

project您看到没有添加您的缓存目录并显示为这样。

> svn st
M  source
?  cache

要设置ignore属性,请执行

svn propset svn:ignore cache。

其中svn:ignore,您要设置的属性的名称,该属性cache的值,以及.您要设置此属性的目录。它应该是cache需要该属性的目录的父目录。

要检查设置了哪些属性:

> svn proplist
Properties on '.':
  svn:ignore

要查看的值svn:ignore

> svn propget svn:ignore
cache

要删除先前设置的属性:

svn propdel svn:ignore

17
我偶然发现了一个棘手的问题。确保你没有一个斜线增加dirname。例如,在键入时svn propset svn:ignore dirname,如果允许(bash)shell为您填写目录名,它将添加该斜杠,并留下命令svn propset svn:ignore dirname/,这不会导致该文件夹被忽略。至少,这是我的经验。
David Weinraub'4

4
“ cache”目录仍将列在“ svn st”中。有没有办法从视图中删除它?(不删除磁盘上的内容)
汤姆·布里托

131

重要提示:

在命令行上您不能使用

svn add *

这还将添加忽略的文件,因为命令行会扩展*,因此svn add认为您希望添加所有文件。因此,请改用此方法:

svn add --force .

就像@binco所说的那样:svn add --force *不会工作。使用圆点而不是星星。
manuell 2015年

80

由于我花了一段时间尝试使其正常工作,因此应注意,如果文件已存在于SVN中,则需要svn delete它们,然后编辑该svn:ignore属性。

我知道这似乎很明显,但是当我认为它只会在本地忽略它们时,它们会一直出现?在我的svn status列表中。


8
如果您只是想忽略文件而不是实际删除它们,请不要忘记在删除文件时使用--keep-local选项。
Dylan Holmes

71

要稍微扩展一下,如果您使用svn命令行工具执行此操作,则需要输入:

svn propedit svn:ignore path/to/dir

这将打开您选择的文本编辑器,然后键入“ *”以忽略其中的所有内容,然后保存并退出-这将在svn中包括目录本身,但忽略其中的所有文件,以忽略目录,请使用父目录的路径,然后在文件中键入目录的名称。保存后,运行更新(“ svn up”),然后检查适当的路径。


8
很好,谢谢。所有其他答案都缺少嵌套目录的情况。因此,上面的示例(有效)然后您输入编辑器ignore_directory(假设在path / to / dir下一级)。但是,这将不起作用:svn propedit svn:ignore。然后在编辑器中输入path / to / dir / ignored_directory。IOW:SVN一次将对象向下一级匹配。
greenoldman

30

svn:ignore在父目录上设置属性:

$ cd parentdir
$ svn ps svn:ignore . 'cachedir'

这将覆盖的任何当前值svn:ignore。您使用以下命令编辑值:

$ svn pe svn:ignore .

这将打开您的编辑器。您可以添加多个模式,每行一个。

您可以使用以下方法查看当前值:

$ svn pg svn:ignore .

如果您使用的是GUI,则应该有一个菜单选项来执行此操作。


3
svn ps svn:ignore . 'cachedir'结果 cachedir is not under version control。改变svn ps svn:ignore 'cachedir' .为我工作
DiCaprio 2015年

21

感谢您所做的所有贡献。我只想分享我的经验中的一些其他信息,而忽略文件。


当文件夹已经受到版本控制时

svn importsvn co文件之后,我们通常第一次进行此操作。

所有运行时缓存附件文件夹都将受版本控制。因此,在svn ps svn:ignore之前,我们需要从存储库中将其删除。

在SVN 1.5以上版本中,我们可以使用svn del --keep-local your_folder,但是对于较早的版本,我的解决方案是:

  1. svn导出文件夹的干净副本(无.svn隐藏文件夹)
  2. svn del本地和存储库,
  3. svn ci
  4. 复制回文件夹
  5. SVN ST和确认文件夹被标记为“?”
  6. 现在我们可以根据解决方案做svn ps

当我们需要多个文件夹被忽略时

  • 在一个目录中,我有两个文件夹需要设置为 svn:ignore
  • 如果我们设置一个,另一个将被删除。
  • 然后我们想知道我们是否需要svn pe

svn pe将需要编辑文本文件,如果需要使用vi设置文本编辑器,则可以使用此命令:

export SVN_EDITOR=vi
  1. 使用“ o”可以打开新行
  2. 输入您要忽略的所有文件夹名称
  3. 按“ Esc”键退出编辑模式
  4. 输入“:wq”,然后点击Enter保存并退出

该文件看起来像这样:

runtime
cache
attachments
assets

您还可以使用svn propset svn:ignore -F .ignorethesefiles .,它将使用文件的内容。我喜欢保留它,以便您知道忽略了什么。编辑需要后续属性。
Gerard ONeill'3

20

首先将其删除...

如果您的目录foo已经在版本控制下,请首先使用以下命令将其删除:

svn rm --keep-local foo

...然后忽略:

svn propset svn:ignore foo .

12

...如果您想忽略多个目录(例如文件build/ temp/*.tmp目录),则可以分两步执行(忽略第一个目录并编辑ignore属性(请参见此处的其他答案)),也可以编写类似以下内容

svn propset svn:ignore "build
temp
*.tmp" .

在命令行上。


12

如果使用特定的SVN客户端TortoiseSVN,则在提交时,可以选择右键单击项目,然后选择“添加到忽略列表”。


9

忽略多个条目的命令有些棘手,需要反斜杠。

svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .

此命令会忽略任何名字cachetmpnull,和and_so_on在当前目录。


6
需要澄清的是:这里的反斜杠不是svn的功能;这只是在外壳上输入多行字符串的一种方法。您也可以使用编辑器,只写多行。
sleske 2011年

bash不需要反斜杠。bash足够聪明,可以知道a是打开的,并且不处理该行。您所需要做的就是在cache,tmp和null之后按Enter。您将看到bash将提示更改为>,以便您知道仍在输入命令。另一种方法是先输入命令(svn),然后按esc键再按v键,这将允许您在编辑器中输入命令。完成后按ZZ执行命令。并且不想执行,然后:q !.
Michael Potter

1
svn propset svn:ignore -F .ignorethesefiles .将允许您使用文件。如前所述,您总是有权。
Gerard ONeill'3

5

我在使嵌套目录被忽略方面遇到问题;我想忽略的顶层目录不会显示为“ svn status”,但所有子目录都显示。这可能对其他所有人都是不言而喻的,但我想我会分享的:

例:

/树干

/ trunk / cache

/ trunk / cache / subdir1

/ trunk / cache / subdir2

cd /trunk
svn ps svn:ignore . /cache
cd /trunk/cache
svn ps svn:ignore . *
svn ci

4

“谢谢” svn提供了一种如此丑陋,虚假且困难的方法来忽略文件。

所以我写了一个脚本svn-ignore-all

#!/bin/sh

# svn-ignore-all

# usage: 
#   1. run svn status to see what is going on at each step 
#   2. add or commit all files that you DO want to have in svn
#   3. remove any random files that you don't want to svn:ignore
#   4. run this script to svn:ignore everything marked '?' in output of `svn status`

svn status |
grep '^?' |
sed 's/^? *//' |
while read f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

另外,要忽略文件/路径名的特定列表,我们可以使用此变体svn-ignore。我猜svn-ignore-all应该真的像xargs svn-ignore。

#!/bin/sh

# svn-ignore

# usage:
#   svn-ignore file/to/ignore ...

for f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

还有一件事:我倾向于用许多随机文件来污染我的svn结帐。当需要提交时,我将这些文件移到“旧”子目录中,并告诉svn忽略“旧”。


嘿,山姆,这是一个很好的脚本。我脑海中浮现出一个问题:也许是因为忽略了存储库中的整个文件夹不起作用,所以我们最终得到了那些“?”这一事实。基本上是我们添加到忽略列表中的文件夹中的修改文件的文件?我只是想知道您的脚本中是否有办法,因为一直运行它很乏味。你做?
SquareCat 2014年

不,我真的不使用它!只是尝试清理我的文件
Sam Watkins 2014年


3

如果您的项目目录名为/ Project,而缓存目录名为/ Project / Cache,则需要在/ Project上设置一个subversion属性。属性名称应为“ svn:ignore”,属性值应为“ Cache”。

有关属性的更多信息,请参见Subversion手册中的页面。


3

杰森的答案将解决问题。但是,不要将svn:ignore设置为“”。在缓存目录中,您可能希望在目录的svn:ignore属性中包含“ cache” ,以防缓存目录不总是存在的情况。我在许多“可丢弃”文件夹中执行此操作。


3

保持SVN更重要的目录:

  1. 这将从存储库中删除文件,但将目录保留在SVN的控制下:

svn delete --keep-local path / directory_to_keep / *

  1. 然后设置为忽略目录(和所有内容):

svn propset svn:ignore“ *” path / directory_to_keep


2

如果您使用的是诸如TortoiseSVN之类的SVN前端,或者某种IDE集成,则在与提交/添加操作相同的菜单中也应该有一个ignore选项。



1

由于您使用的是Versions,因此实际上非常简单:

  • 浏览您签出的副本
  • 单击目录忽略
  • 在右侧的“忽略”框中,单击“编辑”。
  • 键入*。*以忽略所有文件(或* .jpg仅用于jpg文件等)

1

还要注意尾随的斜杠。我发现images/*在忽略设置文件中包含不会忽略./images/。当我跑的时候svn status -u它仍然显示出来? images。因此,我只是将ignore设置更改为just images,没有斜杠。进行状态检查,然后将其清除。


1

通过以下方式使用Eclipse解决:

首先,将文件夹同步到项目:

团队->同步

在下一个视图(团队视图)中,您可以看到可以提交给SVN服务器的所有资源。

因此,选择要忽略的资源的资源文件夹,然后可以使用来忽略它

团队->添加到svn:ignore

之后,在确认窗口中,选择第一个选项:“按名称忽略”。

例如,如果我想忽略目标文件夹及其.class资源,我将进行同步,并在“同步”视图中选择目标文件夹。之后,我将选择

团队->添加

svn:ignore,然后在确认窗口中确认第一个选项。


0

在花了很多时间寻找如何做这个简单的活动之后,我决定发布它,找到一个体面的解释并不难。

首先让样本结构

$ svn st吗?项目/行李箱/目标?项目/树干/myfile.x

1 –首先配置编辑器,在mycase中vim export SVN_EDITOR = vim

2 –“ svn propedit svn:ignore project / trunk /”将打开一个新文件,您可以在我们的情况下添加文件和子目录,键入“ target”,保存并关闭文件即可工作

$ svn st吗?项目/树干/myfile.x

谢谢。

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.