svn - push现有Git存储库SVN

  显示原文与译文双语对照的内容

我一直在Git中做我所有的工作,并把它们推到 GitHub 。 我对软件和网站都很满意,我现在不想改变我的工作实践。

我的指导老师要求所有学生都在一个托管在大学的SVN仓库中工作。 我已经找到了大量的文档和教程,即将把现有的SVN仓库拖入 git,但没有关于将git仓库推向新的SVN仓库。 我期望与git-svn和清新的组合必须有一些方法来做到这一点,但我是一个git新手和分支定变基,也希望所有那些术语不要有信心它们中的任何一个。

然后在git,我想只是运行到新串中推送提交到那个svnrepo上使用 Git,并且只包含在svnrepo当我选择,我希望能保持镜像包是什么

我将是唯一一个致力于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 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, 你可能得到冲突。 通过添加带有状态"未合并"的文件并恢复重定向来解决这些问题。 使用最终,你也就此结束;然后同步回 svn-repo,. 那就是。

保持档案库同步

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


git svn fetch
git rebase trunk

要同步 git -> svn,使用:

 
git svn dcommit

 

最后便笺

在应用到实时存储库之前,你可能需要在本地副本上尝试。 你可以将git-repo复制到临时位置,只需使用 cp -r,因为所有数据都在仓库本身中。 然后,你可以使用以下方法设置file-based测试仓库:


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对待它不同,不能将它的具体化。

有一个将保留完整历史的过程: http://kerneltrap.org/mailarchive/git/2008/10/26/3815034

初始化 git-svn:


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

像"svn/trunk"的--prefix为你提供远程跟踪分支,这一点很棒,因为无法得到模棱两可的名字如果拨打你的本地分支刚"中继"时候。 -s是标准 trunk/tags/branches 布局的快捷方式。

从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仍然应该在主控形状的祖先中显示 svn/trunk

将你的历史记录线性化到主干上:

 
git svn rebase

 

现在"git dcommit -n"应该告诉你它将提交到主干。

 
git svn dcommit

 

下面是我们使它工作的方法:

在你的机器上克隆你的git仓库 somwhere 。 打开。git/config并添加 following(from 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

 

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

cheers!

在subversion存储库中为你的项目创建一个新目录。


# svn mkdir --parents svn://ip/path/project/trunk

更改为Git-managed项目并初始化 git-svn 。


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

这将创建一个提交,因为你的svn项目目录仍然为空。 现在把所有的东西都放在提交上,git svn dcommit,你就应该完成了。 这会严重打乱你的提交日期,尽管。

在 4命令使用 SubGit, 我会提出一个非常短的步需要做 有关详细信息,请参阅这里日志

作为你的主要存储库,并在sync,如果你还是想接着使用即时git与svn不时只需要"导出"改动内容,你可以使用图定制以保持 svn repository. 它可以在不同的源代码管理系统之间复制修订版,并使用你在git中所做的更改更新 svn 。

我没有尝试过 git -> 转换,但是对于 svn -> svn示例,请参见这个答案

如果你不需要使用任何特定的svn,并且你正在使用 Github,你可以使用它们的svn连接器。

更多信息这里 https://github.com/blog/1178-collaborating-on-github-with-subversion

你可以创建一个新的svn仓库。 导出你的git项目( 填充. git 文件) 。 将它添加到svn仓库( 使用你目前在git中的内容初始化仓库) 。 然后使用这些指令在一个新的git项目中导入svn仓库。

但这将使你以前的git历史。

我想分享一个在WordPress社区中使用的工具,叫做散点图

http://evansolomon.me/notes/git-wordpress-plugins-and-a-bit-of-sanity-scatter/

这使得用户能够将他们的git仓库自动发送给 WordPress.org SVN 。 在理论上,这个代码可以应用到任何SVN仓库。

...