GIT-SVN

克隆真正庞大的 SVN 存储库

如果你的 SVN repo 历史非常大,这个操作可能需要几个小时,因为 git-svn 需要重建 SVN repo 的完整历史记录。幸运的是,你只需要克隆一次 SVN repo; 与任何其他 git 存储库一样,你只需将 repo 文件夹复制到其他协作者即可。将文件夹复制到多台计算机将更快,只需从头开始克隆大型 SVN 存储库。

关于提交和 SHA1

使用命令 git svn dcommit 时,将重写你的本地 git 提交。此命令将向 git commit 的消息添加一个文本,该消息引用在 SVN 服务器中创建的 SVN 修订版,这非常有用。但是,添加新文本需要修改现有提交的消息,而这些消息实际上无法完成:git 提交是不可变的。解决方案是使用相同的内容和新消息创建一个新的提交,但从技术上讲它是一个新的提交(即 git commit 的 SHA1 将改变)

由于为 git-svn 创建的 git 提交是本地的,因此 git 提交的 SHA1 ID 在每个 git 存储库之间是不同的! 这意味着你不能使用 SHA1 引用来自其他人的提交,因为相同的提交将在每个本地 git 存储库中具有不同的 SHA1。如果要引用存储库的不同副本之间的提交,则在推送到 SVN 服务器时,需要依赖附加到提交消息的 svn 修订号。

你可以使用 SHA1 进行本地操作(显示/区分特定提交,樱桃选择和重置等)

故障排除

git svn rebase 命令发出校验和不匹配错误

命令 git svn rebase 抛出类似于这样的错误:

  Checksum mismatch: <path_to_file> <some_kind_of_sha1>
  expected: <checksum_number_1>
    got: <checksum_number_2>

解决此问题的方法是在最后一次修改故障文件时将 svn 重置为修订版,并执行 git svn fetch 以恢复 SVN 历史记录。执行 SVN 重置的命令有:

  • git log -1 - <path_to_file>(复制提交消息中出现的 SVN 修订号)
  • git svn reset <revision_number>
  • git svn fetch

你应该能够再次从 SVN 推送/拉取数据

在提交中找不到文件当你尝试从 SVN 获取或拉取时,你会收到类似于此的错误

<file_path> was not found in commit <hash>

这意味着 SVN 中的修订版试图修改由于某种原因在本地副本中不存在的文件。摆脱此错误的最佳方法是强制取消忽略该文件的路径,它将更新为其在最新 SVN 版本中的状态:

  • git svn fetch --ignore-paths <file_path>