我刚开始使用 SVN,并且我有一个在源代码控制下不需要的缓存目录。如何使用 SVN 忽略整个目录/文件夹?
我在 OS X 和命令行上使用 Versions 和 TextMate。
设置父目录的 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
dirname
中添加尾部斜杠。例如,当输入 svn propset svn:ignore dirname
时,如果您允许 (bash) shell 为您填写目录名,它将添加尾部斜杠,给您留下命令 svn propset svn:ignore dirname/
,这不会导致文件夹忽略。至少,这是我的经验。
重要的是要提到:
在命令行上你不能使用
svn add *
这也会添加被忽略的文件,因为命令行会扩展 *
,因此 svn add
认为您希望添加所有文件。因此改用这个:
svn add --force .
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 ps svn:ignore . 'cachedir'
产生 cachedir is not under version control
。更改为 svn ps svn:ignore 'cachedir' .
对我有用
感谢以上所有的贡献。我只想在忽略文件的同时分享一些我的经验中的额外信息。
当文件夹已经处于修订控制之下时
在 svn import 和 svn co 文件之后,我们通常第一次做的事情。
所有运行时缓存、附件文件夹都将受版本控制。因此,在 svn ps svn:ignore 之前,我们需要将其从存储库中删除。
对于 SVN 1.5 以上版本,我们可以使用 svn del --keep-local your_folder
,但对于早期版本,我的解决方案是:
svn 导出文件夹的干净副本(没有 .svn 隐藏文件夹) svn del 本地和存储库,svn ci 复制文件夹 执行 svn st 并确认文件夹标记为“?”现在我们可以根据解决方案来做 svn ps
当我们需要忽略多个文件夹时
在一个目录中,我有两个文件夹需要设置为 svn:ignore
如果我们设置一个,另一个将被删除。
然后我们想知道我们需要svn pe
svn pe
将需要编辑文本文件,如果需要,您可以使用此命令使用 vi 设置文本编辑器:
export SVN_EDITOR=vi
使用“o”,您可以打开一个新行输入所有要忽略的文件夹名称按“esc”键退出编辑模式输入“:wq”然后按Enter保存并退出
该文件看起来就像这样:
runtime
cache
attachments
assets
svn propset svn:ignore -F .ignorethesefiles .
,它将使用文件的内容。我喜欢保留它,这样你就知道什么被忽略了。编辑需要后续 propset。
先把它去掉...
如果您的目录 foo
已受版本控制,请先将其删除:
svn rm --keep-local foo
...然后忽略:
svn propset svn:ignore foo .
...如果您想忽略多个目录(例如 build/
temp/
和 *.tmp
文件),您可以分两步完成(忽略第一个并编辑忽略属性(请参阅此处的其他答案)或者可以写类似
svn propset svn:ignore "build
temp
*.tmp" .
在命令行上。
忽略多个条目的命令有点棘手,需要反斜杠。
svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .
此命令将忽略当前目录中名为 cache
、tmp
、null
和 and_so_on
的任何内容。
svn propset svn:ignore -F .ignorethesefiles .
将允许您使用文件。如前所述,你总是有道具。
Bash oneliner 多次忽略:
svn propset svn:ignore ".project"$'\n'".settings"$'\n'".buildpath" "yourpath"
$'somestring'
表示带有转义序列的字符串文字,因此您可以将其写成更短更简单的 svn propset svn:ignore $'.project\n.settings\n.buildpath' "yourpath"
我在忽略嵌套目录时遇到了问题;我想忽略的顶级目录不会显示'svn status',但所有子目录都会显示。这对其他人来说可能是不言而喻的,但我想我会分享它:
例子:
/trunk /trunk/cache /trunk/cache/subdir1 /trunk/cache/subdir2
cd /trunk
svn ps svn:ignore . /cache
cd /trunk/cache
svn ps svn:ignore . *
svn ci
如果您的项目目录名为/Project,并且您的缓存目录名为/Project/Cache,那么您需要在/Project 上设置一个颠覆属性。属性名称应为“svn:ignore”,属性值应为“Cache”。
有关属性的更多信息,请参阅 Subversion 手册中的 this 页。
杰森的回答会成功。但是,不是将 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 将忽略的目录:
这将从存储库中删除文件,但将目录保持在 SVN 控制之下:
svn delete --keep-local 路径/directory_to_keep/*
然后设置为忽略目录(和所有内容):
svn propset svn:ignore "*" path/directory_to_keep
由于您使用的是版本,因此实际上非常简单:
浏览您的签出副本
单击要忽略的目录
在右侧的“忽略”框中单击编辑
键入 *.* 以忽略所有文件(或 *.jpg 仅用于 jpg 文件等)
也要注意你的尾部斜线。我发现在我的忽略设置文件中包含 images/*
并没有忽略 ./images/
。当我运行 svn status -u
时,它仍然显示 ? images
。所以,我只是将忽略设置更改为 images
,没有斜杠。进行状态检查并将其清除。
在花了很多时间寻找如何进行这个简单的活动之后,我决定发布它并不难找到一个体面的解释。
先让样本结构
svn st ?项目/主干/目标?项目/主干/myfile.x
1 - 首先配置编辑器,在mycase vim export SVN_EDITOR=vim
– “svn propedit svn:ignore project/trunk/”将打开一个新文件,您可以在我们的案例类型“target”中添加文件和子目录,保存并关闭文件并运行
svn st ?项目/主干/myfile.x
谢谢。
不定期副业成功案例分享
svn rm --keep-local dirname
首先。 (我的 svn stat 输出很大,我把头撞了一会儿。)svn propset svn:ignore -F file.txt .
svn propget svn:ignore
被忽略的路径,否则svn propset svn:ignore dirname .
将覆盖当前被忽略的路径。最好使用svn propedit svn:ignore .
。如果您已经覆盖了 svn:ignore,请使用svn proplist -v <PATH>|<URL>
获取特定路径的当前值,然后通过复制/粘贴到svn propedit svn:ignore .
中恢复该值。