SVN:忽略但不删除文件夹

13
我有一个垃圾文件夹,用于存放我的应用程序的临时文件。我不想提交它们,但是这个文件夹必须存在,否则应用程序会崩溃。
如果我使用标准TortoiseSVN的忽略功能,它会将"svn:ignore junk_folder"属性添加到父文件夹中,但也会删除"junk_folder",这是不可以的。
如果我只恢复TortoiseSVN执行的删除操作,但保留添加的"svn:ignore"属性,这种解决方案将失败。 TortoiseSVN将报告"junk_folder"内的文件为非版本化的,而我想避免这种情况。
是否有任何解决方案可以让我在SVN中完全忽略特定的文件夹(因此无论放入什么东西,都不会被报告为未版本化,也不会自动提交),而不删除它?
编辑:我忘记说我正在谈论已经被版本化的文件夹。似乎,如果您在尚未版本化(第一次提交之前)的文件夹上忽略(svn:ignore或TortoiseSVN中的适当选项),那么一切都没问题。 但是,如果您在已经在存储库中的文件夹上这样做,则TortoiseSVN会将其标记为已删除,并在下一次提交时从存储库中删除它(但不会从本地工作副本中删除)。

你能否只添加文件夹而不包括其中的内容,这样检出时就会生成一个空文件夹? - Wug
@Wug - 我认为是因为他的应用程序会在那里创建文件,所以他不希望SVN不断告诉他该目录中有未版本化的文件。 - CodingWithSpike
那么,添加文件夹,并在“junk_folder”上设置svn:ignore *,忽略该文件夹的内容而不是文件夹本身? - Wrikken
我有几个SVN项目,其中包括必须存在且本身已经版本化但没有版本内容的配置目录和日志目录。SVN不会对它们产生影响。也许我只是使用不当 :) - Wug
@trejder,也许你可以告诉我们你正在使用的 TortoiseSVN 版本是什么?它是非常古老的版本吗?因为 ignore 不应该删除任何东西。 - crashmstr
显示剩余2条评论
4个回答

13

我认为你可以在该文件夹中为“*”添加一个svn:ignore,而不是在“junk_folder”本身上添加(换句话说,忽略“junk_folder / *”)。

我不知道TortoiseSVN是否有此按钮,但是您可以通过以下命令行命令完成:

svn propset svn:ignore "*" junk_folder

(至少我认为这是正确的语法,在我的脑海里。如果有人认为它是错误的,请纠正我)


我应该指出,这种方法仍然在 SVN 中检查了一个空的“junk_folder”,因此当您进行干净的检出时,您将获得一个空的“junk_folder”,但 SVN 不会告诉您稍后在该文件夹中创建的任何未版本化的文件。我想这就是你所问的... - CodingWithSpike
这正是我所需要的!:] 我需要每次检出到一个新文件夹时都检查“junk_folder”(空文件夹)。而且我需要忽略其中的任何内容。你的解决方案很完美! - trejder

2

我正在使用Eclipse Subversive和Tortoise SVN。

我解决这个问题的方法是使用Tortoise的属性对话框(但我认为Eclipse也有同样的功能)

如果您在工作副本中右键单击文件夹,例如“tmp”或“cache”等,您可以简单地添加“svn:ignore”属性并在其中放置通配符。您需要使用高级按钮添加它,因为它不是要添加的属性的快速列表。

我主要在Joomla上开发网站,并经常安装程序或其他组件会将文件留在我不想要的位置。正如前面提到的,“右键忽略”方法使用“svn:ignore”来忽略这些文件夹意味着这些文件夹完全从版本库中排除,这不是您想要的 - 您想要排除这些文件夹的内容,或者有时只是某些扩展名的文件。

在从stackoverflow获得了很多建议之后,今天我注册了一个帐户仅仅为了回答这个问题,希望能帮助到某些人 - 我试图附加屏幕截图,但我的声望不够:(


2

我通常用它来管理编译器中间输出目录,从未删除任何文件。

为了重新测试这个功能,我在其中一个工作副本中找到了一个未版本化的目录。我右键单击该目录,并导航到“添加到忽略列表”选项。它展开为目录名称。我选择了目录名称,并收到一个弹出消息,指出它已被添加到忽略列表中。检查工作副本状态后,父文件夹只有属性修改,没有文件被标记为删除。

忽略文件和目录

enter image description here

另外一点需要注意的是,您还可以在“检查修改”和提交对话框中使用底部附近的复选框隐藏未版本化的文件。


1
你写的那个问题很奇怪!每当我使用这个选项时,它立即将这样的文件夹标记为删除,在下一次提交时实际上会将其删除。这会导致应用程序崩溃。这已经被测试了数百次,所以我无法相信你在文件夹(而不是文件!)上使用此选项且未在下一次提交时将该文件夹删除。 - trejder
在屏幕截图中,crashmstr 右键单击的是文件夹内的一个文件(在本例中命名为 Copy.bak),而不是文件夹本身。 - CodingWithSpike
但是,楼主说忽略文件夹也会导致其被删除。他说:“如果我使用标准的TortoiseSVN的忽略功能,它会将"svn:ignore junk_folder"属性添加到父文件夹中,但它也会删除"junk_folder",这是不允许的。” - CodingWithSpike
刚才我留言了,我再试了一次(之前也试过),没有文件被删除。我不明白忽略会怎么导致删除。 - crashmstr
啊,好观点crashmstr; 如果文件夹已经被版本化,那么SVN将执行删除操作,以使现在被忽略的文件夹从SVN中移除。如果文件夹从未被版本化,则不会执行删除操作。 - CodingWithSpike
显示剩余6条评论

1
你是什么意思 "如果我使用标准的TortoiseSVN忽略功能,它会将svn:ignore junk_folder属性添加到父文件夹中,但它也会删除junk_folder..."?
Subversion不会删除您要求其忽略的文件夹。事实上,这就是svn:ignore的全部目的:允许您拥有一个不在存储库中的文件夹,而不会被Subversion抱怨。
这个junk_folder是如何创建的?是通过您使用的脚本还是手动完成的?它什么时候被删除?您是指当您进行新的检出时,junk_folder不在那里,还是当您在其父目录上添加svn:ignore属性时,TortoiseSVN立即将其删除?
如果您需要该文件夹永久保存在存储库中,但必须保持为空,则可以将junk_folder添加到存储库中,然后创建一个设置为*svn:ignore属性。这将忽略文件夹中的任何内容。
我的建议是确保需要junk_folder的任何脚本在创建之前先确认其是否存在,不要将其添加到您的代码库中。您可以使用此预提交挂钩来避免将其添加到代码库中。这将是处理此问题的最佳方法。没有理由在您的代码库中包含名为junk_folder的空目录。

嗨!如上所述,在编辑问题和所有评论时。如果您忽略它并且它已经被版本化,Subversion(TortoiseSVN)会删除文件夹。仅在忽略未版本化的文件夹时才会发生无删除操作。对于所有已版本化的文件夹,您必须在内容上使用“svn:ignore *”。因为,如果您忽略一个文件夹,它将在下一次提交时从存储库中删除(但不是LWC)。 - trejder
@trejder,你是说如果有一个名为junk_folder的版本化文件夹,并且我在父文件夹中添加了属性svn:ignore junk_folder,那么Tortoise会自动删除junk_folder而无需我进行任何操作吗?我想我可以理解其中的逻辑,但这听起来很危险。 - David W.
@trejder 刚刚查看了TortoiseSVN的文档。您无法将已存在的文件或文件夹添加到忽略列表中。但是,您可以选择“忽略并取消版本控制文件”以将其添加到忽略列表中。 - David W.
不,如果您使用“忽略和未版本文件”选项(从上下文菜单中),那么TortoiseSVN会向父文件夹添加一个svn:ignore junk_folder的属性,并将junk_folder文件夹标记为已删除。下一次提交时,该文件夹将从存储库中删除(但不会从LWC中删除)。如果您只手动向父文件夹添加一个svn:ignore junk_folder的属性,那么TortoiseSVN当然不会删除任何文件。但是仍然会报告junk_folder中未版本化的文件。最终解决方案是在要忽略的文件夹中添加svn:ignore *,在本例中是junk_folder。 - trejder

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