如何将(多个)文件添加到现有SVN存储库(没有本地工作副本)中的(不同)目录中?

时间:2019-03-30 02:25:18

标签: svn command-line

我正在编写一个工具,该工具将(其中包括)自动将文件添加到SVN信息库分支的过程。存储库分支已经存在,可能很大(数十GB或数百GB),并且包含许多子目录。我的工具将需要接受多个文件,并将这些文件添加到分支内的各个(已经存在)目录中。

从本质上讲,我有一个位于http://svn.example.com/path/to/repository的存储库分支,其中包含(子)目录树a/...b/...c/...d/...等上。

然后我要添加一些文件,例如:

http://svn.example.com/path/to/repository/a/a_1/file1
http://svn.example.com/path/to/repository/a/b_1/b_1_1/file2

(依此类推)。

这些文件可能已经存在于存储库中(在这种情况下,它们将需要用本地副本覆盖)或可能不存在(在这种情况下,需要添加)。子目录a/a_1b/b_1/b_1_1可以假定已经存在(并且其中包含其他文件)。我一次有一个“不错的数量”(通常在20到50之间)可上传的文件。

所说的存储库分支没有本地工作副本(并且完成此操作后,就没有持久的理由存在本地副本)。

从我已经在此过程中进行的搜索来看,似乎就像最好的方法一样:

  • 创建存储库的本地工作副本;
  • 将我的文件复制到相同的文件中
  • svn add个文件;然后
  • 提交整个工具包和面条。

智慧:

svn checkout https://svn.example.com/path/to/repository /local/path --depth=empty
mkdir -p /local/path/a/a_1 && cp -f file1 /local/path/a/a_1/.
mkdir -p /local/path/b/b_1/b_1_1 && cp -f file2 /local/path/b/b_1/b_1_1/.
...etc...
svn add /local/path/* --depth=infinity
svn update /local/path --accept=mine-full
svn commit /local/path --message="some message"

...但是,当我尝试此操作时,出现错误Directory '/local/path/a' is out of date(后跟Path already exists, path '/path/to/repository/a')。

有一次,我在玩游戏的同时设法将上述内容与某种形式的svn resolved结合使用,这些形式最初似乎可以使用,直到我意识到它已删除了所有 other 文件在存储库目标子目录中。糟糕!

有人能解决这个问题吗?下载整个存储库分支(及其所有文件)是不可行的。如上所述,它太大了以至于无法成为可行的解决方案(特别是因为以后我将不再需要它,因此它将在本地立即删除)。

从搜索来看,似乎没有一种很好的方法来仅检出SVN分支的目录结构,而没有关联的文件。现在,我最好的主意是遍历本地目录结构并一次寻址每个文件,然后通过单独的操作将它们检出,添加并提交到存储库中。但这每批可能涉及许多签到,这并不理想。

({svn import同样也不理想,因为文件可能已经在存储库中,因此需要被覆盖。)

有什么好的解决方法吗?

1 个答案:

答案 0 :(得分:0)

我认为您正在搜索svnmucc

您可以在没有工作副本 的存储库上执行某些工作。例如,您可以使用svnmucc mkdir http://svn.example.com/path/to/repository/newdir创建目录,使用svnmucc put myfile http://svn.example.com/path/to/repository/any_file放置文件,依此类推。当然,您可以使用-m选项定义提交消息(如果没有,则应将文件编辑为在svn commit中。

您可以阅读一些示例here