繁体   English   中英

如何使用 SVN 忽略目录?

[英]How do I ignore a directory with SVN?

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

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

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

svn propset svn:ignore dirname .

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

svn propedit svn:ignore .

这是一个示例目录结构:

\project
    \source
    \cache
    \other

project中,您会看到未添加缓存目录并显示为这样。

> svn status
M  source
?  cache

要设置忽略属性,请执行

svn propset svn:忽略缓存。

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

要检查设置了哪些属性:

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

查看svn:ignore的值:

> svn propget svn:ignore
cache

要删除以前设置的属性:

svn propdel svn:ignore

重要的是要提到:

在命令行上你不能使用

svn add *

这也将添加被忽略的文件,因为命令行扩展*并且因此svn add认为您希望添加所有文件。 因此改用这个:

svn add --force .

由于我花了一段时间试图让它工作,应该注意如果文件已经存在于 SVN 中,你需要svn delete它们,然后编辑svn:ignore属性。

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

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

svn propedit svn:ignore path/to/dir

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

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

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

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

$ svn pe svn:ignore .

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

您可以通过以下方式查看当前值:

$ svn pg svn:ignore .

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

感谢以上所有的贡献。 我只想在忽略文件的同时分享一些我的经验中的额外信息。


当文件夹已经处于修订控制之下时

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" 然后回车保存并退出

该文件看起来就像这样:

runtime
cache
attachments
assets

先把它去掉...

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

svn rm --keep-local foo

...然后忽略:

svn propset svn:ignore foo .

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

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

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

在命令行上。

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

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

此命令将忽略当前目录中名为cachetmpnulland_so_on的任何内容。

Bash oneliner 多次忽略:

svn propset svn:ignore ".project"$'\n'".settings"$'\n'".buildpath" "yourpath"

我在忽略嵌套目录时遇到了问题; 我想忽略的顶级目录不会显示'svn status',但所有子目录都会显示。 这对其他人来说可能是不言而喻的,但我想我会分享它:

例子:

/树干

/主干/缓存

/主干/缓存/子目录1

/主干/缓存/子目录2

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

如果您的项目目录名为/Project,并且您的缓存目录名为/Project/Cache,那么您需要在/Project 上设置一个颠覆属性。 属性名称应为“svn:ignore”,属性值应为“Cache”。

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

杰森的回答会成功。 但是,不是将 svn:ignore 设置为 "." 在缓存目录上,您可能希望在目录的 svn:ignore 属性中包含“缓存”,以防缓存目录并不总是存在。 我在许多“一次性”文件夹上执行此操作。

“谢谢” 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 忽略“旧”。

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

保留 SVN 将忽略的目录:

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

svn delete --keep-local 路径/directory_to_keep/*

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

svn propset svn:ignore "*" path/directory_to_keep

设置 svn:ignore属性 大多数 UI svn 工具都有办法做到这一点,以及链接中的命令行讨论。

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

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

也要注意你的尾部斜线。 我发现在我的忽略设置文件中包含images/*并没有忽略./images/ 当我运行svn status -u它仍然显示? images ? images 所以,我只是将忽略设置更改为仅images ,没有斜线。 进行状态检查并将其清除。

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

先让样本结构

$ svn st ? 项目/主干/目标? 项目/主干/myfile.x

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

2 – “svn propedit svn:ignore project/trunk/”将打开一个新文件,您可以在我们的案例类型“target”中添加文件和子目录,保存并关闭文件并运行

$ svn st ? 项目/主干/myfile.x

谢谢。

Eclipse解决了下一个问题:

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

团队 - >同步

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

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

团队 - >添加到svn:ignore

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

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

team->添加

svn:ignore然后我将确认确认窗口中的第一个选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM