"svn mv" 后丢失 SVN 提交

Losing SVN commits after "svn mv"

我们使用 SubGit 将项目从 SVN 迁移到 GIT,但遇到了项目问题,该问题改变了它们在 SVN 中的位置

我们假设 PROJECT-A 及其 trunk、tags 和 brunches 文件夹位于 http://svn.server/repo/sub-folder/PROJECT-A。在其历史的某个时刻,整个项目被移动到另一个文件夹,然后恢复。

r10001:   svn mv –m “moving to a wrong location” http://svn.server/repo/sub-folder/PROJECT-A http://svn.server/repo/wrong-folder/.
r10002:   svn mv –m “moving project back to sub-folder” http://svn.server/repo/wrong-folder/PROJECT-A http://svn.server/repo/sub-folder/.

我们在应用 SubGit 后在 GIT 中获得的提交是 moving project back to sub-folder 和所有后来的提交。然而,在 moving to a wrong location 之前发生的一切都不会被迁移,尽管 svn log 显示了整个提交历史。

subgit 是否可以选择在提供的 SVN url 下导入(安装)所有提交? Currenlty 它的工作方式与 --stop-on-copy

SubGit 始终与您指定的 SVN URL 一起工作,并且永远不会注意到它之外的任何东西。这就是为什么如果你指定

http://svn.server/repo/sub-folder/PROJECT-A

作为SVNURL,会完全忽略

http://svn.server/repo/wrong-folder/PROJECT-A

因为它超出了这个 URL。

幸运的是,针对您的情况有一个解决方法。尝试以下配置:

[svn]
  ...
  url = http://svn.server/repo
  trunk = sub-folder/PROJECT-A/trunk:refs/heads/master
  branches = sub-folder/PROJECT-A/branches/*:refs/heads/*
  tags = sub-folder/PROJECT-A/tags/*:refs/tags/*
  shelves = sub-folder/PROJECT-A/shelves/*:refs/shelves/*
  branches = wrong-folder/PROJECT-A/trunk:refs/heads/wrong/master
  branches = wrong-folder/PROJECT-A/branches/*:refs/heads/wrong/*
  tags = wrong-folder/PROJECT-A/tags/*:refs/tags/wrong/*
  branches = wrong-folder/PROJECT-A/shelves/*:refs/shelves/wrong/*

我想,您理解这个想法:使用存储库根目录作为 SVN URL 并向分支路径添加前缀。

或者您可以尝试使用 "subgit configure" 的 --layout auto 功能:

subgit configure --svn-url http://svn.server/repo --layout auto --trunk sub-folder/PROJECT-A/trunk repo.git

"subgit configure" 的这种变体将扫描 SVN 历史记录,并将检测主干被复制到和从中复制的所有目录,并将它们视为目录。然后它将生成具有相应 trunk/branches/tags/shelves 选项的 repo.git/subgit/config 文件。我不建议你 100% 依赖这个自动建议。您可以使用这些生成的选项作为灵感,但我鼓励您手动编写映射。