如何将(多个)文件添加到现有 SVN 存储库(没有本地工作副本)中的(不同)目录?
How to add (multiple) files to (different) directories within an existing SVN repository (that has no local working copy)?
我正在编写一个工具,它将(除其他外)自动将文件添加到 SVN 存储库分支的过程。存储库分支已经存在,可能很大(数十或数百 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_1
和 b/b_1/b_1_1
已经存在(并且其中有其他文件)。我一次要上传 "decent number" 个(通常在 20 到 50 个之间)文件。
所述存储库分支没有本地工作副本(并且一旦此操作完成,就没有本地副本存在的持久理由)。
根据我已经在此过程中完成的搜索,似乎最好的方法是:
- 创建存储库的本地工作副本;
- 将我的文件复制到同一个目录中;
svn add
个文件;然后
- 提交整个 kit-and-kaboodle。
也就是说:
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
同样不理想,因为文件可能已经在存储库中,因此需要覆盖。)
有什么好的解决办法吗?
我正在编写一个工具,它将(除其他外)自动将文件添加到 SVN 存储库分支的过程。存储库分支已经存在,可能很大(数十或数百 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_1
和 b/b_1/b_1_1
已经存在(并且其中有其他文件)。我一次要上传 "decent number" 个(通常在 20 到 50 个之间)文件。
所述存储库分支没有本地工作副本(并且一旦此操作完成,就没有本地副本存在的持久理由)。
根据我已经在此过程中完成的搜索,似乎最好的方法是:
- 创建存储库的本地工作副本;
- 将我的文件复制到同一个目录中;
svn add
个文件;然后- 提交整个 kit-and-kaboodle。
也就是说:
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
同样不理想,因为文件可能已经在存储库中,因此需要覆盖。)
有什么好的解决办法吗?