为什么GIT在运行git fetch -p origin后删除了克隆的SVN repo的所有分支?

时间:2016-08-09 07:33:52

标签: git svn migration clone

我使用git svn clone --stdlayout克隆了一个SVN存储库。克隆存储库后,我使用atlassian migration script

对其进行了清理
java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git 
  --force.

然后我设置新的远程并使用git push --all origin

将存储库推送到新的远程GIT服务器

在尝试清理更多内容之后,我还运行git fetch -p origin但删除了所有原始SVN分支:

 ...
 x [deleted]         (none)     -> origin/release_II
 x [deleted]         (none)     -> origin/release_III
 ... etc

克隆的SVN存储库是正常的吗?看起来原始的SVN分支不是新GIT存储库中的真正分支。在迁移过程中我忘记了什么吗?修剪命令似乎很难撤消。如果我们将来(可能是偶然)运行类似的命令,我们怎样才能确保我们不会松开这些分支?

1 个答案:

答案 0 :(得分:0)

事实证明我的SVN分支实际上并未转换为真正的GIT分支。所以我看到的唯一分支机构指向远程分支指向SVN仓库,而这些分支无法再到达。因此,运行修剪,我的所有分支都被删除了。

大多数svn-git迁移教程(包括git-book)和工具都假设您可以通过在克隆的repo上运行cp -Rf .git/refs/remotes/origin/* .git/refs/heads/来创建实际的git分支。但是在我的情况下,分支机构是在一个特殊的&svn'目录:.git\svn\refs\remotes\origin

我将在线找到的一些bash脚本修改为以下内容:

# Convert SVN branches to GIT branches
for branch in `git branch -r | grep "origin/[^tags]" | sed 's/ origin\///'`; do
  git branch $branch refs/remotes/origin/$branch; 
done

# Convert SVN tags to GIT tags
for tag in `git branch -r | grep "tags/" | sed 's/ tags\///'`; do
  git tag -a -m"Converting SVN tags" $tag refs/remotes/$tag
done

现在,我可以通过git branchgit tag --list

标记来查看我的所有分支

添加远程来源,运行git push origin --allgit push origin --tags即可完成。