【发布时间】:2021-06-04 08:30:00
【问题描述】:
背景
我们计划在 Azure DevOps 中将 SVN 单向迁移到 Git,以便我们可以保留消息的提交历史记录。正如您所料,我们进行了一次试运行,在经过 26 小时处理后,我们想出了最终工作的命令列表。
这些命令是:
在 Git Bash 中运行以获取来自 SVN 的 Git 格式的所有作者列表:
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
以管理员身份在 Windows cmd shell 中运行,注意复制完成是因为经过多次尝试,这些是使用 git ignore 命令和 git lfs track 命令创建的,因此保存以供重复使用。 git 配置文件也是如此,我告诉它要处理的显式 SVN 标签:
git svn init --prefix "" --no-metadata --trunk=Trunk --branches=Branches --tags=Tags https://jeeves/svn/ResourceDirectoryPortal/
git lfs install
copy ..\.gitattributes
copy ..\.gitignore
copy ..\authors-transform.txt
copy ..\config .\.git
git add .gitattributes
git add .gitignore
git commit -m "Preparation"
git svn fetch --log-window-size=2500 -A authors-transform.txt
在 Git Bash 中运行以创建 Git 标签:
for t in $(git for-each-ref --format='%(refname:short)' refs/remotes/tags); do git tag ${t/tags\//} $t && git branch -D -r $t; done
通过批处理文件在 Windows cmd 中运行以下一系列命令来删除错误创建的标签,因为这样做比尝试修复它并等待另外 26 小时的迁移时间更容易:
git tag -d NameOfTagHere
然后我们从 /.git/config 中删除“SVN”部分并删除 /.git/svn 文件夹。之后我们以管理员身份从 Windows cmd shell 运行:
git remote add origin https://AzureDevops.url.here/for-empty-git-repo
git config http.version HTTP/1.1
git push origin --all
git push origin --tags
问题
因为我们在存储库中有一些 SQL Server 压缩的 .BAK 文件,用于在构建测试、自动化集成测试等过程中进行恢复……Azure Git 存储库大约需要 11 分钟才能克隆。希望使用 Git LFS 可以使这些文件的影响更可接受,但决定进行另一次测试:
- **/*.bak 已添加到 .gitignore 文件中
- *.bak LFS 跟踪行已从 .gitattributes 文件中删除
- 运行与上述相同的一组命令,但在随机时间后,但通常在 1 到 2 小时范围内,我得到以下 3 个错误之一,这些错误出现在最后一行显示的不同 SVN 修订/文件在它们出现在输出中之前:
ls-tree, command error 127
error closing pipe: Broken pipe at C:/Program Files/Git/mingw64/share/perl5/Git/IndexInfo.pm line 32. at /usr/lib/perl5/vendor_perl/SVN/Ra.pm line 623
rev-parse --git-path svn: command returned error: 127
config svn-remote.svn.tags-maxRev 2062: command returned error: 127
理论检验
-
我想到的可能是我使用的 AzureDevops 解决方法 用于 Git LFS 能够正确处理较大的文件,即 是以下命令:
git config http.version HTTP/1.1我在没有运行该命令的情况下再次尝试,但仍然得到了一个 以上2个错误。
-
随后的尝试我只是从上面运行 git svn fetch 命令,以防它只是一些暂时性问题 - 不,不是!
-
我清空文件夹并重新开始的最新尝试,跳过了 Azure devops 行,它还没有再次失败,但只有大约一个小时。
难倒
在使用 Git 方面,我相当菜鸟。我知道它是分布式的,这与 SVN 根本不同。我只是不明白相同的命令如何随机爆炸而没有更详细的错误。 SVN repo 的唯一区别是提交了 50-100 个以上
更新:2021 年 8 月 3 日 尝试通过 Git Bash 运行整个事情,而不是仅仅通过一些,现在开始报告第三个错误。我在这里抓着稻草。我什至尝试将 log-window-size 参数从 2500 降低到 1000 再降低到 500。仍然没有乐趣。
更新:2021 年 9 月 3 日 我们的一位系统管理员查看了 SVN 日志,似乎它被来自 2 台不同机器的同一个通用用户锤击。我联系了负责这些机器的相关人员,并让其中一台机器停止了它正在做的事情,所以理论上减少了 50% 到 SVN 服务器的持续流量再次尝试并得到了我添加到的错误 4上面的错误列表。所以看起来这不是超时问题。
【问题讨论】: