svn to Git 只有一个子目录
Svn to Git of only one subdirectory
我知道 git-svn 并用它来将 SVN 存储库迁移到 Git。
对于一个回购协议,我有一个特定的要求,但我找不到解决方案。该 SVN 存储库包含多个实际项目作为子目录:
trunk/
project1/
project2/
project3/
branches/
branch1/
project1/
project3/
project2/
...
等等...
我想要做的是将这些 "sub-projects" 中的每一个都导入到 git 自己的仓库中 - 显然,保留修订历史、分支、提交消息、标签等
我可以使用--ignore-paths
和--include-paths
开关一次只拉取其中一个子项目,但它们仍然会出现在各自的project1
等子目录下.我真正想要结束的是 project
在每个分支(包括主干)的根中的内容。
有办法吗?
我找到了解决办法。它不像git svn clone
那么简单,但也不是太难。所以,这就是我所做的(例如,对于问题场景中的 project1
):
- 在 git 服务器上为
project1
创建一个空存储库
- 将空的 repo 克隆到我的本地机器上:
git clone git@git.server.com:group/project1.git
- 进入那个空的 repo 工作目录:
cd project1
- 初始化git svn repo:
git svn init --stdlayout --no-metadata https://svn.server.com/group
现在,神奇的地方来了。如果此时我 运行 git config --local --list
,我得到以下信息(仅显示相关行):
svn-remote.svn.fetch=trunk:refs/remotes/trunk
svn-remote.svn.branches=branches/*:refs/remotes/branches/*
svn-remote.svn.tags=tags/*:refs/remotes/tags/*
我现在需要做的就是 git config --local --edit
并在正确的位置添加 project1
:
svn-remote.svn.fetch=trunk/project1:refs/remotes/trunk
svn-remote.svn.branches=branches/*/project1:refs/remotes/branches/*
svn-remote.svn.tags=tags/*/project1:refs/remotes/tags/*
现在你可以git svn fetch
设置分支和标签:
for branch in `git branch -r | grep "branches/" | sed 's/ branches\///'`; do
git branch $branch refs/remotes/branches/$branch
done
for tag in `git branch -r | grep "tags/" | sed 's/ tags\///'`; do
git tag -a -m"Converting SVN tags" $tag refs/remotes/tags/$tag
done
最后全部推送到远程:
git push --all origin
git push --tags origin
现在,如果您克隆您的存储库,您将在克隆存储库的根目录中获得 project1
的内容 - 正是我要找的内容。
我知道 git-svn 并用它来将 SVN 存储库迁移到 Git。
对于一个回购协议,我有一个特定的要求,但我找不到解决方案。该 SVN 存储库包含多个实际项目作为子目录:
trunk/
project1/
project2/
project3/
branches/
branch1/
project1/
project3/
project2/
...
等等...
我想要做的是将这些 "sub-projects" 中的每一个都导入到 git 自己的仓库中 - 显然,保留修订历史、分支、提交消息、标签等
我可以使用--ignore-paths
和--include-paths
开关一次只拉取其中一个子项目,但它们仍然会出现在各自的project1
等子目录下.我真正想要结束的是 project
在每个分支(包括主干)的根中的内容。
有办法吗?
我找到了解决办法。它不像git svn clone
那么简单,但也不是太难。所以,这就是我所做的(例如,对于问题场景中的 project1
):
- 在 git 服务器上为
project1
创建一个空存储库
- 将空的 repo 克隆到我的本地机器上:
git clone git@git.server.com:group/project1.git
- 进入那个空的 repo 工作目录:
cd project1
- 初始化git svn repo:
git svn init --stdlayout --no-metadata https://svn.server.com/group
现在,神奇的地方来了。如果此时我 运行
git config --local --list
,我得到以下信息(仅显示相关行):svn-remote.svn.fetch=trunk:refs/remotes/trunk svn-remote.svn.branches=branches/*:refs/remotes/branches/* svn-remote.svn.tags=tags/*:refs/remotes/tags/*
我现在需要做的就是
git config --local --edit
并在正确的位置添加project1
:svn-remote.svn.fetch=trunk/project1:refs/remotes/trunk svn-remote.svn.branches=branches/*/project1:refs/remotes/branches/* svn-remote.svn.tags=tags/*/project1:refs/remotes/tags/*
现在你可以
git svn fetch
设置分支和标签:
for branch in `git branch -r | grep "branches/" | sed 's/ branches\///'`; do git branch $branch refs/remotes/branches/$branch done for tag in `git branch -r | grep "tags/" | sed 's/ tags\///'`; do git tag -a -m"Converting SVN tags" $tag refs/remotes/tags/$tag done
最后全部推送到远程:
git push --all origin git push --tags origin
现在,如果您克隆您的存储库,您将在克隆存储库的根目录中获得 project1
的内容 - 正是我要找的内容。