将.svn目录从一个检出副本复制到非检出副本以使其成为检出副本

6
我有一个在生产环境中的大型应用程序,现在想将其移至版本控制下。因此,我创建了一个新的代码库,并导入应用程序,但排除掉不应该受版本控制的各个目录和文件。现在,我需要将已安装的副本变成检出版本(但仍保留额外的文件)。在最近的 SVN 版本中,我会使用 --force 选项,在现有目录上面直接覆盖进行检出。但可悲的是,我有一份古老的 SVN 版本,还没有添加 --force 选项(而且暂时不能升级...长话短说)。
所以,我检出了应用程序到另一个目录,并想要简单地复制所有 .svn 目录到原始目录中,从而将原始目录变成一个检出版本,同时保留额外的文件。现在,也许是我今天状态不佳,错过了一些很明显的东西,但我似乎无法弄清楚这个问题。以下是我尝试了的方法:
  1. 使用 rsync:我无法找到正确的组合方式来递归捕获所有的 .svn 目录,但不包括其他任何内容。
  2. 使用 cp:我无法找到一个好的方法来命中整个应用程序中所有的 .svn 目录。
  3. 使用带有-exec cp的find:我遇到了一些麻烦,发现找到的文件的路径前缀会弄乱目标路径。我可以使用 -printf'%P' 来排除它,但似乎无法用 {} 替换 exec 中的参数。
  4. 使用 find 和 xargs 来进行复制:我遇到了问题,发现 find 会在发送父级目录之前先发送子目录。不幸的是,find 没有 --breadth 选项。
你有什么想法吗?
其他信息:
  • bash 3.0.0.14
  • rsync 2.6.3 p28
  • cp 5.2.1
  • svn 1.3.2

请确保正确设置 .svn 文件夹的权限,否则可能存在潜在的安全漏洞。该网站解释了这个问题: http://www.adamgotterer.com/2009/01/26/hacking-the-svn-directory/ - Joshua
2个回答

6
使用tar和find命令在干净的检出中捕获.svn目录,然后解压到您的应用程序中。
cd /tmp/
svn co XXX
cd XXX
find . -name .svn -print0 | tar cf /tmp/XXX.tar --null -T -
cd /to/your/app/
tar xf /tmp/XXX.tar

编辑:更改find/tar命令以使用NUL终止符,以应对包含空格的文件名的鲁棒性问题。原始命令如下:

tar cf /tmp/XXX.tar $(find . -name .svn)

哇,我不知道$(...)语法 - 我猜这是bash的一个特性。这似乎可以工作,除了一个问题:它会错过那些在shell中显示为多个标记的文件/目录(例如名称中带有空格的文件)。我该如何修改tar...find命令来处理这些名称?示例文件名:“6 - the foo”输出:$ tar -cf ~/testsvn.tar '$(find . -name .svn)' tar: './6: Cannot stat: No such file or directory tar: -: Cannot stat: No such file or directory tar: the: Cannot stat: No such file or directory tar: foo: Cannot stat: No such file or directory - mr. w
抱歉评论乱七八糟的 - 搞不清如何在评论中强制换行。 - mr. w
是的,$(...) 是 bash 的一个特性。文件名中的空格很讨厌。你可能想要使用类似于 "find . -name .svn -print0 | tar cf /tmp/XXX.tar -T - --null" 的东西。-print0 告诉 find 使用 NUL 分隔符字符而不是换行符。-T- 告诉 tar 从 stdin 中读取文件名,--null 告诉 tar 使用 NUL 分隔符字符而不是换行符。 - bstpierre
太好了!我开始尝试做这件事,但是我不知道如何让tar从stdin读取。 (事实证明,在man页面中没有提到使用连字符来实现此目的。实际上,“stdin”根本没有被提到。)无论如何,非常感谢!那正是我所需要的 - 它像魔法一样奏效。 - mr. w
在像tar这样的工具中,使用连字符来引用标准输入/输出是一种相当常见的特性。 - bstpierre
2
将“-T -”和“--null”的顺序反转,改为“--null -T -”。 - Matt Joiner

0
(5)你不能只是将检出复制到另一个目录,然后将额外的文件复制到该目录,确认一切正常后再切换到从新目录运行应用程序吗?

不幸的是,这并不是一个好选择,因为随着应用程序运行,额外文件列表会不断变化。 - mr. w

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