【问题标题】:Copying the .svn directories from a checkout to a non-checkout to make it a checkout将 .svn 目录从结帐复制到非结帐以使其成为结帐
【发布时间】:2009-09-23 21:24:12
【问题描述】:

我在生产环境中有一个大型应用程序,我正试图在版本控制下移动。因此,我创建了一个新的 repo 并导入了应用程序,减去了不应受版本控制的各种目录和文件。现在,我需要将已安装的副本结帐(但仍保留额外的文件)。此时,在最新版本的 SVN 中,我只需使用 --force 选项对现有目录进行检查。但可悲的是,我有一个古老的 SVN 版本,在添加 --force 选项之前(还不能升级......长篇大论)。

所以,我将应用程序签出到另一个目录,并且想简单地将所有 .svn 目录复制到原始目录中,从而将原始目录变成签出,同时保留额外的文件。现在,也许我只是度过了艰难的一天,错过了一些在普通网站上的东西,但我似乎无法弄清楚这一点。以下是我迄今为止尝试过的方法:

  1. 使用 rsync:我似乎无法正确组合包含和排除指令来递归捕获所有 .svn 目录,但仅此而已。

  2. 使用 cp:我想不出一个好方法让它贯穿整个应用程序的所有 .svn 目录。

  3. 将 find 与 -exec cp 一起使用:我遇到了问题,因为找到的文件的路径名的前导部分会弄乱目标路径。我可以使用 -printf '%P' 排除它,但这似乎并没有用于 exec 的 {} 替换。

  4. 将 find 与 xargs 一起用于 cp:在发送父目录之前,我在 find 发送子目录时遇到了麻烦。不幸的是,find 没有 --breadth 选项。

有什么想法吗?

其他信息:

  • bash 3.0.0.14
  • rsync 2.6.3 p28
  • cp 5.2.1
  • svn 1.3.2

【问题讨论】:

标签: linux svn merge svn-checkout


【解决方案1】:

使用 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 - foo” 输出:$ tar -cf ~/testsvn.tar \'$(find . -name .svn)\' tar: './6: Cannot stat: No such file or directory tar : -: 无法统计: 没有这样的文件或目录 tar: the: 无法统计: 没有这样的文件或目录 tar: foo: 无法统计: 没有这样的文件或目录
  • 抱歉,评论混乱 - 无法弄清楚如何在 cmets 中强制换行。
  • 是的,$(...) 是一个 bash 功能。文件名中的空格很糟糕。您可能想改用“find . -name .svn -print0 | tar cf /tmp/XXX.tar -T - --null”之类的东西。 -print0 告诉 find 使用 NUL 分隔符而不是换行符。 -T- 告诉 tar 从标准输入读取文件名, --null 告诉 tar 使用 NUL 分隔符而不是换行符。
  • 完美!我开始尝试这样做,但我不知道如何让 tar 从标准输入中读取。 (事实证明,手册页中没有提到为此目的使用连字符。事实上,根本没有提到“stdin”。)无论如何,非常感谢!这正是我所需要的——它就像一种魅力。
  • 颠倒-T ---null的顺序,必须是--null -T -
【解决方案2】:

(5) 你不能只签出到不同的目录,然后将额外的文件复制到那个目录,在切换到从新目录运行应用程序之前验证一切正常吗?

【讨论】:

  • 不幸的是,这并不是一个好的选择,因为额外文件的列表会随着应用程序的运行而不断变化。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多