将 SVN 后的主干文件夹重命名为 Git 迁移

Renaming trunk folder after SVN to Git Migration

我有 30 个项目从 SVN 迁移到 Git。

但是,当我浏览文件夹结构时,我仍然在每个项目中看到 trunk 文件夹。有没有办法快速自动地删除它?

这是我的 svn 文件夹结构,请注意存储库本身没有主干,但项目有:

--MyRepository
  --Project1
    --trunk
      -- files
  --Project2
    --trunk
      -- files
  --Project3
    --trunk
      -- files
  --Project4
    --trunk
      -- files
  --Project5
    --trunk
      -- files
  -- ..

这就是我想要的 Git 存储库:

--MyRepository
  --Project1
    -- files
  --Project2
    -- files
  -- ..

提前致谢。

PS: 我想我可以分享我用来迁移的命令。就是这样:

mkdir gitRepo && cd gitRepo
git svn init http://bla/svn/myRepo --no-metadata
git config svn.authorsfile ../authors.txt
git svn fetch

如果迁移正确,那么应该没有trunk文件夹。参见 git svn--stdlayout。所以,你有三个选择:

  1. 正确重做迁移(最简单,但会影响 git 回购用户,如果 任何)。
  2. 使用filter-branch或类似的东西重新雕刻git历史(应该比第一个快并且不需要原始svn 回购,但会影响 git 个回购用户(如果有的话)。
  3. 只需移动文件夹并提交(最简单和最安全,但主干文件夹将永远留在历史记录中)。

如何正确迁移repo。据我所知,你有一个像这样的 svn repo 结构:

/
/projectA
/projectA/trunk
/projectA/branches/...
/projectB
/projectB/trunk
/projectB/branches/...

所以你应该做两次迁移,为每个项目创建两个 git 存储库:

 git svn clone --stdlayout full/svn/repo/url/projectA
 git svn clone --stdlayout full/svn/repo/url/projectB

问题是——svn 对主干和分支一无所知,它只知道一个文件夹。当您迁移到 git 时,您应该知道您的 svn 存储库结构并相应地将文件夹映射到分支。

不,您应该首先根据需要构建文件夹根目录,然后映射根目录。正确的做法。

那么,就这样吧。

神奇的命令是:

git filter-branch -f --index-filter \
    'git ls-files -s | sed "s-/trunk/-/-" |
            GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
            git update-index --index-info &&
     mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' af117ec86a30ba6676571cd1f73083c5cfbec0bd..HEAD

注意 ..HEAD 之前的提交标记,它应该是您应该输入的第二个或第三个最早的提交标记。如果你输入第一个,你会得到一个错误。

要找出最早提交的提交标签,只需使用:

git log

并尽可能向下滚动,在那里您会看到最早的提交。拿第二个或第三个。完成了。