我一直在用Git做我所有的工作,并将其推送到GitHub。我对软件和网站都很满意,我不希望在这一点上改变我的工作实践。

我的博士导师要求所有学生将作业保存在学校托管的SVN存储库中。我发现了大量关于将现有的SVN存储库下拉到Git中的文档和教程,但没有关于将Git存储库推到新的SVN存储库中的文档和教程。我希望通过结合Git -svn、一个新的分支和rebase以及所有这些美妙的术语来实现这一点,但我是Git新手,对其中任何一个都没有信心。

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

我将是唯一一个致力于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

它毫无问题地运行着。我希望这能帮助到一些人。

因为我必须使用不同的用户名向SVN存储库授权(我的源使用私钥/公钥身份验证),所以我必须使用——username属性。

其他回答

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

但是这会丢失之前的Git历史记录。

下面是我们如何做到的:

在你的机器上克隆你的Git存储库。

打开.git/config并添加以下内容(来自维护Git存储库的只读SVN镜像):

[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

现在,如果它因为某种原因在这里中断了,输入这三行:

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

最后,您可以提交到SVN:

git svn dcommit

注意:我总是在事后丢弃那个文件夹。

我需要将现有的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

它毫无问题地运行着。我希望这能帮助到一些人。

因为我必须使用不同的用户名向SVN存储库授权(我的源使用私钥/公钥身份验证),所以我必须使用——username属性。

> SVN,具有完整的提交历史

我有一个Git项目,必须把它移到SVN上。这是我如何做到的,保持整个提交历史。唯一丢失的是原始提交时间,因为libSVN在执行git svn dcommit时将设置本地时间。

Howto:

Have a SVN repository where we want to import our stuff to and clone it with git-svn: git svn clone https://path.to/svn/repository repo.git-svn` Go there: cd repo.git-svn Add the remote of the Git repository (in this example I'm using C:/Projects/repo.git). You want to push to SVN and give it the name old-git: git remote add old-git file:///C/Projects/repo.git/ Fetch the information from the master branch from the old-git repository to the current repository: git fetch old-git master Checkout the master branch of the old-git remote into a new branch called old in the current repository: git checkout -b old old-git/master` Rebase to put the HEAD on top of old-git/master. This will maintain all your commits. What this does basically is to take all of your work done in Git and put it on top of the work you are accessing from SVN. git rebase master Now go back to your master branch: git checkout master And you can see that you have a clean commit history. This is what you want to push to SVN. Push your work to SVN: git svn dcommit

这是所有。这是非常干净的,没有黑客,一切工作完美的开箱即用。享受。

如果你不需要使用任何特定的SVN,你正在使用GitHub,你可以使用他们的SVN连接器。

更多信息在这里:在GitHub上与Subversion合作