将现有Git存储库推送到SVN

将现有Git存储库推送到SVN,svn,git,git-svn,Svn,Git,Git Svn,我一直在用Git做我所有的工作,并推动GitHub。我对软件和网站都很满意,现在我不想改变我的工作方式 我的博士生导师要求所有学生将他们的作品保存在学校托管的SVN存储库中。我找到了大量关于将现有SVN存储库拉入Git的文档和教程,但没有找到关于将Git存储库推入新的SVN存储库的文档和教程。我想一定有办法结合git svn和一个新的分支、重定基址以及所有这些美妙的条款来做到这一点,但我是git新手,对其中任何一个都没有信心 然后,我只想运行几个命令,在选择时将提交推送到该SVN存储库。我希望继

我一直在用Git做我所有的工作,并推动GitHub。我对软件和网站都很满意,现在我不想改变我的工作方式

我的博士生导师要求所有学生将他们的作品保存在学校托管的SVN存储库中。我找到了大量关于将现有SVN存储库拉入Git的文档和教程,但没有找到关于将Git存储库推入新的SVN存储库的文档和教程。我想一定有办法结合git svn和一个新的分支、重定基址以及所有这些美妙的条款来做到这一点,但我是git新手,对其中任何一个都没有信心

然后,我只想运行几个命令,在选择时将提交推送到该SVN存储库。我希望继续使用Git,让SVN存储库镜像Git中的内容


如果这有什么不同的话,我将是唯一一个致力于SVN的人。

您可以创建一个新的SVN存储库。导出Git项目(充实.Git文件)。将其添加到SVN存储库中(使用您目前在Git中拥有的内容初始化存储库)。 然后使用在新的Git项目中导入SVN存储库的说明


但这将丢失您以前的Git历史记录

如果您想继续使用Git作为您的主存储库,并且只需要不时将修订版“导出”到SVN,那么您可以使用来保持SVN存储库的同步。它可以在不同的源代码管理系统之间复制修订,并使用您在Git中所做的更改更新SVN


我没有尝试过Git到SVN的转换,但是有关SVN->SVN示例,请参见。

在Subversion存储库中为您的项目创建一个新目录

# svn mkdir --parents svn://ip/path/project/trunk
更改为Git管理的项目并初始化Git svn

# git svn init svn://ip/path/project -s
# git svn fetch

这将创建一个提交,因为您的SVN项目目录仍然为空。现在,在提交时重新设置所有内容的基础,
git svn dcommit
,您应该完成了。不过,这会严重打乱你的提交日期。

我也需要这个,在Bombe的回答和一些摆弄的帮助下,我成功了。以下是菜谱:

导入Git->Subversion 在#3之后,你会得到这样一条神秘的信息:

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

别理它

当你跑步时,你可能会遇到冲突。通过添加状态为“未合并”的文件并恢复重设基础来解决这些问题。最终,你会成功的;然后使用
dcommit
同步回SVN存储库。就这些

保持存储库同步 现在,您可以使用以下命令从SVN同步到Git:

git svn fetch
git rebase trunk
要从Git同步到SVN,请使用:

git svn dcommit
最后说明 在应用到实时存储库之前,您可能希望在本地副本上尝试这一点。您可以将Git存储库复制到临时位置;只需使用
cp-r
,因为所有数据都在存储库中。然后,您可以使用以下方法设置基于文件的测试存储库:

svnadmin create /home/name/tmp/test-repo
并使用以下方法检查工作副本:

svn co file:///home/name/tmp/test-repo svn-working-copy
这将允许你在做出任何持久的改变之前先处理一些事情

附录:如果你搞砸了
git svn init
如果您不小心用错误的URL运行了
git svn init
,并且您没有足够的智能来备份您的工作(不要问…),那么您不能再次运行相同的命令。但是,您可以通过发出以下命令撤消更改:

rm -rf .git/svn
edit .git/config
并删除节
[svn remote“svn”]


然后可以重新运行
git svn init

直接使用
git-rebase
将丢失第一次提交。Git对待它不一样,不能重新设置它的基础

有一个程序可以保存完整的历史记录:

我将在这里转录解决方案,但学分是给比约恩的

初始化git svn:

git svn init -s --prefix=svn/ https://svn/svn/SANDBOX/warren/test2
前缀为您提供远程跟踪分支,如“svn/trunk”,这很好,因为如果您将本地分支称为“trunk”,则不会得到不明确的名称。而
-s
是标准主干/标记/分支布局的快捷方式

从SVN获取初始内容:

git svn fetch
现在查找根提交的哈希(应显示单个提交):

然后获取空中继提交的哈希:

git rev-parse svn/trunk
创建移植物:

git replace --graft <root-commit-hash> <svn-trunk-commit-hash>
git replace -d <root-commit-hash>
放下移植物:

git replace --graft <root-commit-hash> <svn-trunk-commit-hash>
git replace -d <root-commit-hash>
现在“gitsvndcommit-n”应该告诉您它将提交到trunk

git svn dcommit

以下是我们如何使其工作的:

在计算机上的某个位置克隆Git存储库

打开.git/config并添加以下内容(从):

现在,在控制台窗口中键入以下内容:

git svn fetch svn
git checkout -b svn git-svn
git merge master
现在,如果它因任何原因在此处中断,请键入以下三行:

git checkout --theirs .
git add .
git commit -m "some message"
最后,您可以向SVN提交:

git svn dcommit

注意:我总是在事后废弃该文件夹。

我建议使用4个命令中的一条非常简短的指令。有关详细信息,请参见此。

如果您不必使用任何特定的SVN,并且您正在使用GitHub,则可以使用他们的SVN连接器


更多信息在这里:

我想分享WordPress社区中使用的一个很棒的工具,名为District


这使得用户能够自动将他们的Git存储库发送到wordpress.org SVN。理论上,此代码可以应用于任何SVN存储库。

我需要将现有Git存储库提交到一个空的SVN存储库

我就是这样做到的:

$ git checkout master
$ git branch svn
$ git svn init -s --prefix=svn/ --username <user> https://path.to.repo.com/svn/project/
$ git checkout svn
$ git svn fetch
$ git reset --hard remotes/svn/trunk
$ git merge master
$ git svn dcommit
$git签出主机
$git分行svn
$git svn init-s--prefix=svn/--usernamehttps://path.to.repo.com/svn/project/
$git签出svn
$git svn fetch
$git重置--硬远程/svn/trunk
$git合并主机
$git svn dcommit
它毫无问题地工作。我希望这对某人有帮助

由于我必须使用不同的用户名向SVN存储库授权(我的
源代码使用私钥/公钥身份验证),因此我必须使用
--username
属性。

什么
git checkout --theirs .
git add .
git commit -m "some message"
git svn dcommit
$ git checkout master
$ git branch svn
$ git svn init -s --prefix=svn/ --username <user> https://path.to.repo.com/svn/project/
$ git checkout svn
$ git svn fetch
$ git reset --hard remotes/svn/trunk
$ git merge master
$ git svn dcommit
git svn dcommit
$ Project> git svn init protocol://path/to/repo -s
$ Project> git svn fetch
$ Project> git add .
$ Project> git commit -m "Importing project sources"
$ Project> git svn dcommit
git svn clone https://path.to/svn/repository repo.git-svn`
cd repo.git-svn
git remote add old-git file:///C/Projects/repo.git/
git fetch old-git master
git checkout -b old old-git/master`
git rebase master
git checkout master
git svn dcommit
$ sudo apt-get install git subversion mercurial python-subversion
[extensions]
hgext.convert=
$ mkdir svn
$ mkdir git
$ svnadmin create svn/project
$ git clone server/path/project.git git/project
$ hg convert --dest-type svn git/project svn/project
#!/bin/bash
exit 0;
$ chmod +x svn/project/hooks/pre-revprop-change
$ cd project-wc
$ svn propedit svn:date --revprop -r 1
$ svn log -r 1:HEAD
$ cd ..
$ svnadmin dump svn/project > project.dump
sudo apt-get install git-svn subversion
cd PROJECT_FOLDER
git svn init -s protocol:///path/to/repo/PROJECT_FOLDER
git svn fetch
git rebase origin/trunk
git add .
git commit -m "Importing Git repository"
git svn dcommit