将 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
。所以,你有三个选择:
- 正确重做迁移(最简单,但会影响 git 回购用户,如果
任何)。
- 使用
filter-branch
或类似的东西重新雕刻git历史(应该比第一个快并且不需要原始svn
回购,但会影响 git 个回购用户(如果有的话)。
- 只需移动文件夹并提交(最简单和最安全,但主干文件夹将永远留在历史记录中)。
如何正确迁移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
并尽可能向下滚动,在那里您会看到最早的提交。拿第二个或第三个。完成了。
我有 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
。所以,你有三个选择:
- 正确重做迁移(最简单,但会影响 git 回购用户,如果 任何)。
- 使用
filter-branch
或类似的东西重新雕刻git历史(应该比第一个快并且不需要原始svn 回购,但会影响 git 个回购用户(如果有的话)。 - 只需移动文件夹并提交(最简单和最安全,但主干文件夹将永远留在历史记录中)。
如何正确迁移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
并尽可能向下滚动,在那里您会看到最早的提交。拿第二个或第三个。完成了。