SVN忽略文件,类似于.gitignore。

58

Git 中,如果我有一个包含许多项目的工程,例如大量的Java项目,我可以在根目录下创建一个 .gitignore 文件,它将在整个代码库中被“尊重”。

那么如何为SVN项目做到这一点呢?

例如,如何通过命令行设置 "svn ignore" 以忽略以下类似于 .gitignore 的文件?

*.class
*.jar
*.war
*.ear
target/
.classpath
.settings/
.project
.metadata
bin/

问题最重要的部分是:如何让它在根目录中的新文件夹中生效?例如:

我在根目录下运行了svn propset svn:ignore "*.class" . -R并提交。好的:

root
- folder1/
-- *.class (ignored)
-- other files (ok)
- folder2/
-- *.class (ignored)
-- other files (ok)

现在,我创建了文件夹3。之前的svn:ignore设置不会应用于此文件夹,对吗?有没有办法让它应用呢?

现在,我创建文件夹3。之前的svn:ignore设置不会应用于此文件夹,对吗?有没有办法让它应用呢?


可能是在Subversion中递归地忽略整个源树中的文件的重复问题。 - Adam Crume
4个回答

83

你可以使用 svn:ignore。一般来说,你需要告诉 SVN 对文件应用特殊的属性:

svn propset svn:ignore "*.jpg" .

(请注意命令末尾的句点。)

对于多个文件,您可以添加换行符。

与此处完全相同,包括换行:

svn propset svn:ignore "file1
file2
file3" dir1

检查文件是否被忽略:

svn status --no-ignore

然后提交代码。

是的,许多重复的问题已经有了答案。

您可以参考我最喜欢的svn cheatguide

您可以创建一个名为svn-ignore.txt的文件,其中包含您忽略的文件和目录:

*.class
*.jar
*.war
*.ear
 target/
.classpath
.settings/
.project
.metadata
 bin/

现在请尝试以下操作:

svn propset svn:ignore -RF /root/svn-ignore.txt . [dot for current dir]

-R 表示递归。


你会如何处理多级目录,例如 app/code/core - jzahedieh
递归参数“-R”应该处理任意深度的目录。 - Gerrit
3
从这个速查表中:编辑一个文件夹的忽略列表: $ svn propedit svn:ignore your_dir_name 说明:以上命令用于在SVN版本控制系统中编辑一个文件夹的忽略列表,以便在提交更改时忽略特定的文件或文件类型。 - MarkHu
  1. 这是否意味着每次提交都需要设置忽略文件,或者只需设置一次,今后工作流程中将应用该设置?
  2. 如何取消对文件的忽略?
- Fed
1
在我的环境中,需要删除 svn-ignore.txt 中文件夹名称前面的空格和后面的斜杠,例如 target/。操作系统为 Windows 10,使用的 SVN 客户端版本为 TortoiseSVN 1.12.0。 - kena0ki
显示剩余3条评论

2
这是我模拟 .svnignore 的方法。
创建一个名为 ~/bin/svn 的 svn 包装器。
#!/bin/bash
case "$1" in
commit|status|apply-ignore)
    if test -f .svnignore ; then
        echo "Apply .svnignore: $(/usr/bin/svn propset svn:ignore -F .svnignore .)"
    fi
    ;;
esac
case "$1" in
apply-ignore) ;;
*) exec /usr/bin/svn "$@" ;;
esac

然后在 /usr/bin 之前将 ~/bin 添加到您的路径中。
PATH=~/bin:$PATH ; export PATH

它在提交和状态命令中应用 .svnignore,并且还可以使用 svn apply-ignore 手动应用。

1

如果你像许多人一样使用TortoiseSVN,那么有一种简单的方法可以忽略文件。在Windows资源管理器中,你可以右键单击任何地方以打开TortoiseSVN菜单,然后选择设置,在常规选项卡下,在标记为Subversion的部分下单击编辑按钮。它将启动记事本或默认文本编辑器,并打开名为config的文件。

在文件中找到一行带有global-ignores和#注释的行:

### Set global-ignores to a set of whitespace-delimited globs
### which Subversion will ignore in its 'status' output, and
### while importing or adding files and directories.
### '*' matches leading dots, e.g. '*.rej' matches '.foo.rej'.
# global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__
#   *.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db

取消注释该行,并添加或替换文件模式以忽略您想要忽略的文件,然后保存该文件。

global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__
    #   *.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db

0
我用了稍微不同的方法解决了这个问题。这只适用于使用Bash shell并安装了Perl的机器,但几乎每台Mac和Linux机器都有。
将以下内容添加到您的.bashrc.bash_profile文件中:
alias _ss="svn status | egrep -v '`cat .svnignore|perl -p -e 's/\n/|/'`'"

不要忘记重新启动终端或执行以下操作:

source ~/.bashrc
(or .bash_profile if that's what you used)

现在创建一个名为.svnignore的文件,并将其放置在您检出存储库的目录中。
files/to/ignore
another/file
tmp
node_modules

现在当你运行

_ss

在你的工作副本的根目录中,它将读取 .svnignore 文件并忽略其中的任何内容。

我像版本控制 .gitignore 文件一样版本控制 .svnignore 文件。

注意:这只影响 svn status 命令,并不会阻止你添加/提交被忽略的文件。


2
有正确的方法可以解决这个问题,不需要使用这种hack手段。 - dimir
@dimir 也许你想以相同的方式使用git和svn。例如,GitHub也有一个svn桥接器。 - Polluks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接