将现有的git存储库推送到SVN

我一直在Git中做所有的工作,并推到GitHub上。 我对软件和网站都非常满意,在这一点上我不想改变我的工作方式。

我的博士顾问要求所有学生将他们的工作保存在大学托管的SVN存储库中。 我发现约到现有的SVN回购下拉到混帐吨的文档和教程,但没有关于推动一个git回购到一个新的SVN回购。 我期望必须有某种方式与混帐SVN和新的分支和重订基期以及所有那些美妙的方面的组合来做到这一点,但我是一个git的新手,不觉得有信心与任何人。

然后,我想只要运行一个命令夫妇的推提交到SVN回购当我选择,我想使用Git来保持和只是有SVN回购镜什么是Git的。

如果这有什么不同,我将成为唯一一个承诺SVN的人。

任何有关如何做到这一点的指示将非常感谢!


我也需要这个,在Bombe的回答+一些摆弄的帮助下,我得到了它的工作。 这是配方:

导入git - > svn

1. cd /path/to/git/localrepo
2. svn mkdir --parents protocol:///path/to/repo/PROJECT/trunk -m "Importing git repo"
3. git svn init protocol:///path/to/repo/PROJECT -s
4. git svn fetch
5. git rebase origin/trunk
5.1.  git status
5.2.  git add (conflicted-files)
5.3.  git rebase --continue
5.4.  (repeat 5.1.)
6. git svn dcommit

#3后你会得到一个神秘的消息,像这样:

使用更高级别的URL: protocol:///path/to/repo/PROJECT => protocol:///path/to/repo

只是忽略这一点。

当你运行#5时,你可能会发生冲突。 通过添加状态为“unmerged”并恢复rebase的文件来解决这些问题。 最终,你会完成的; 然后使用dcommit同步回到svn-repo。 就这样。

保持回购同步

您现在可以使用以下命令从svn - > git进行同步:

git svn fetch
git rebase trunk

并从git - > svn同步,使用:

git svn dcommit

最后说明

在申请实时回购前,您可能需要在本地副本上进行试用。 您可以将git-repo复制到临时位置,只需使用cp -r ,因为所有数据都位于回购本身中。 然后您可以使用以下命令设置基于文件的测试回购:

svnadmin create /home/name/tmp/test-repo

并检查工作副本,使用:

svn co file:///home/name/tmp/test-repo svn-working-copy

这会让你在做任何持久的改变之前玩弄东西。

附录:如果你搞砸了git svn init

如果你不小心运行git svn init与错误的网址,而你没有足够的智慧把你的工作备份(不要问...),你不能只是再次运行相同的命令。 但是,您可以通过发出以下命令撤销更改

rm -rf .git/svn
edit .git/config

并删除节[svn-remote "svn"]节。

然后你可以重新运行git svn init


以下是我们的工作方式:

在你的机器上克隆你的git仓库。 打开.git / config并添加以下内容(从http://www.kerrybuckley.org/2009/10/06/maintaining-a-read-only-svn-mirror-of-a-git-repository/):

[svn-remote "svn"]
    url = https://your.svn.repo
    fetch = :refs/remotes/git-svn

现在,从控制台窗口输入以下内容:

git svn fetch svn
git checkout -b svn git-svn
git merge master

现在,如果出于任何原因在这里打破,请输入以下3行:

git checkout --theirs .
git add .
git commit -m "some message"

最后,你可以承诺svn

git svn dcommit

注意:我总是在之后取消该文件夹。

欢呼!


直接使用git rebase会失去第一次提交。 Git认为它不同,并且不能重新定义它。

有一个程序可以保存完整的历史记录:http://kerneltrap.org/mailarchive/git/2008/10/26/3815034

我会在这里抄录这个解决方案,但是Björn的学分。

初始化git-svn:

git svn init -s --prefix=svn/ https://svn/svn/SANDBOX/warren/test2

--prefix为你提供远程跟踪分支,比如“svn / trunk”,这很好,因为如果你打电话给你的本地分支只是“trunk”,那么你不会得到含糊的名字。 而-s是标准中继/标签/分支布局的快捷方式。

从svn获取最初的东西:

git svn fetch

现在查找根提交的散列(应显示单个提交):

git rev-list --parents master | grep '^.{40}$'

然后获取空的中继提交的散列:

git rev-parse svn/trunk

创建嫁接:

echo <root-commit-hash> <svn-trunk-commit-hash> >> .git/info/grafts

现在,“gitk”应该显示svn / trunk作为您的主分支所基于的第一个提交。

使移植永久:

git filter-branch -- ^svn/trunk --all

放下移植物:

rm .git/info/grafts

gitk仍然应该在master的祖先中显示svn / trunk

在主干顶部线性化历史记录:

git svn rebase

现在“git svn dcommit -n”应该告诉你它将要提交给trunk。

git svn dcommit
链接地址: http://www.djcxy.com/p/19451.html

上一篇: Pushing an existing git repository to SVN

下一篇: Whether a variable is undefined