如何让SVN外部仓库与主仓库一同提交并在复制时同步?
批量提交主仓库与外部仓库变更
不管是用命令行还是借助TortoiseSVN工具,都能实现无需逐个进入仓库提交的需求:
方法1:用TortoiseSVN命令行触发批量提交窗口
虽然你平时不用TortoiseSVN的GUI,但可以用它自带的TortoiseProc.exe命令行工具一键唤起包含外部仓库的提交窗口:
- 打开命令提示符,执行以下命令(替换为你的主仓库路径和提交信息):
TortoiseProc.exe /command:commit /path:"C:\你的主仓库路径" /includeexternals /msg:"提交主仓库及所有外部仓库修改" - 弹出的提交窗口会自动列出主仓库和所有外部仓库的变更,确认后点击提交即可一次性完成所有仓库的提交。
方法2:纯命令行脚本批量提交
如果不想弹出GUI窗口,可以写个简单的脚本遍历外部仓库逐个提交,再提交主仓库:
Windows批处理示例
@echo off setlocal enabledelayedexpansion :: 替换为你的主仓库路径和提交信息 set MAIN_REPO=C:\你的主仓库路径 set COMMIT_MSG="提交主仓库及外部仓库修改" :: 遍历svn:externals配置的所有外部仓库路径(忽略注释行) for /f "tokens=*" %%d in ('svn propget svn:externals %MAIN_REPO% ^| findstr /r "^[^#]"') do ( :: 提取外部仓库的本地相对路径 for /f "tokens=1" %%p in ("%%d") do ( echo 正在提交外部仓库:!MAIN_REPO!\%%p svn commit !MAIN_REPO!\%%p -m !COMMIT_MSG! ) ) :: 最后提交主仓库 echo 正在提交主仓库 svn commit %MAIN_REPO% -m %COMMIT_MSG% endlocal
类Unix Shell脚本示例
#!/bin/bash MAIN_REPO="/你的主仓库路径" COMMIT_MSG="提交主仓库及外部仓库修改" # 遍历svn:externals配置的外部仓库路径(忽略注释行) svn propget svn:externals "$MAIN_REPO" | grep -v "^#" | while read -r line; do EXT_PATH=$(echo "$line" | awk '{print $1}') echo "正在提交外部仓库:$MAIN_REPO/$EXT_PATH" svn commit "$MAIN_REPO/$EXT_PATH" -m "$COMMIT_MSG" done # 提交主仓库 echo "正在提交主仓库" svn commit "$MAIN_REPO" -m "$COMMIT_MSG"
SVN Copy打标签时的外部仓库版本同步问题
默认情况下,svn copy操作只会复制主仓库的svn:externals属性,但如果该属性里的外部仓库URL是指向HEAD版本(未指定版本号),后续检出标签时,外部仓库会拉取最新的HEAD版本,而非打标签时的对应版本,必然会出现版本不匹配的问题。
解决方法:固定外部仓库版本后再打标签
手动操作步骤
- 获取每个外部仓库的当前版本号:进入外部仓库目录,执行
svn info | grep Revision得到版本号。 - 修改主仓库的
svn:externals属性,将每个外部仓库的URL改为带版本号的格式,比如:- 原配置:
drivers https://svn.example.com/drivers - 修改后:
drivers https://svn.example.com/drivers@1234(1234为当前外部仓库的版本号)
- 原配置:
- 提交主仓库的
svn:externals属性变更。 - 执行
svn copy命令打标签:svn copy "C:\你的主仓库路径" "svn://你的仓库地址/tags/v1.0" -m "打v1.0版本标签" - (可选)如果后续开发需要继续使用HEAD版本的外部仓库,可以把主仓库的
svn:externals改回不带版本号的格式。
用TortoiseSVN命令行自动处理
借助TortoiseSVN工具可以一键完成“固定外部版本+打标签”的操作,无需手动修改属性:
TortoiseProc.exe /command:copy /path:"C:\你的主仓库路径" /dest:"svn://你的仓库地址/tags/v1.0" /includeexternals /fixedexternals /msg:"打v1.0版本标签,固定外部仓库版本"
这个命令会自动将所有外部仓库的版本固定到当前版本,再复制主仓库内容到标签路径,后续检出标签时,外部仓库会拉取打标签时的对应版本,保证一致性。
内容的提问来源于stack exchange,提问作者Anton Tropashko
相关产品推荐
相关产品推荐

