如何在svn和Windows上镜像git,只需简单的回购

如何在svn和Windows上镜像git,只需简单的回购,git,svn,Git,Svn,有很多关于从SVN迁移到git的信息,但我正在寻找一种将git镜像到SVN的方法,其中git回购是预先存在的,SVN回购需要更新git回购的内容,并随后保持最新。(这是一面镜子,我不需要双向同步) (为什么?因为dev已经迁移到git,但管理层只信任svn。这为我们赢得了改变态度的时间…我发现最接近我想要的是,但我遇到了与评论中的人相同的问题:svn日志被合并消息污染了 主要的问题是有两个完全不同的历史,没有办法将它们永久地结合起来。git svn必须从现有的svn repo开始,因此初始提交就

有很多关于从SVN迁移到git的信息,但我正在寻找一种将git镜像到SVN的方法,其中git回购是预先存在的,SVN回购需要更新git回购的内容,并随后保持最新。(这是一面镜子,我不需要双向同步)


(为什么?因为dev已经迁移到git,但管理层只信任svn。这为我们赢得了改变态度的时间…

我发现最接近我想要的是,但我遇到了与评论中的人相同的问题:svn日志被合并消息污染了

主要的问题是有两个完全不同的历史,没有办法将它们永久地结合起来。git svn必须从现有的svn repo开始,因此初始提交就从那里开始。但我不想永久性地重写git回购的历史,以SVN初始提交为基础

答案在很大程度上帮助了我,我认为我已经完成了第一次同步,这很好,但问题是它试图将所有的历史从git重新基址到svn分支,尽管该分支已经包含了大部分历史。这最终导致尝试进行“向后”合并(将文件的旧版本合并到新版本),这会产生无法解决的冲突(您每次都必须再次执行)

所以我改采樱桃

无论如何,这里是设置:这是一个完整的演练,在本地创建所有内容。它可以适应你已经拥有的任何东西

创建裸git回购 创建本地git工作repo 此时,添加到本地git工作repo的新文件已同步到裸repo

创建空的subversion 将裸体克隆到镜像repo #(cd到测试文件夹) git clone[到bare.git的绝对路径]镜像 光盘镜像 code.git\config#我在这里使用的是VSCode:根据需要进行编辑

将以下行添加到文件中:

[svn-remote "svn"]
    url = [path to svn repo including /trunk]
    fetch = :refs/remotes/git-svn
提交给svn 这将从svn获取空的“first commit”,将从bare repo克隆的所有更改重新绑定到svn上,然后dcommits返回给svn。此时,所有回购都是同步的

(请注意,对于具有大量历史记录的现有回购,如果在
主回购的过去历史记录中存在分支/合并,则可能需要一些手动合并)

设立必要的分支机构 初始设置将
master
指向svn。所以

git checkout -b svn
git checkout -B master origin/master
git checkout -b previous
其思想是,
svn
分支跟踪svn远程,
master
跟踪原点/主机,
previous
指向master/svn的最后一次同步。通过这种方式,我们可以使用从
previous
master
的提交范围来确定要选择的内容

设置挂钩 要设置为自动同步到svn步骤,请在裸repo的
\hooks
文件夹中创建文件
post receive
。内容如下:

#!/bin/sh
#
# After receiving pushed commits, move to ;irror and update to svn
unset GIT_DIR # weird but without this, cd doesn't influence execution directory
cd ..\\mirror
git checkout master
git pull origin
git checkout svn
git cherry-pick previous..master
git svn dcommit
git checkout previous
git merge --ff master
exit
[svn-remote "svn"]
    url = [path to svn repo including /trunk]
    fetch = :refs/remotes/git-svn
git svn fetch
git rebase --onto remotes/git-svn --root master 
git svn dcommit
git checkout -b svn
git checkout -B master origin/master
git checkout -b previous
#!/bin/sh
#
# After receiving pushed commits, move to ;irror and update to svn
unset GIT_DIR # weird but without this, cd doesn't influence execution directory
cd ..\\mirror
git checkout master
git pull origin
git checkout svn
git cherry-pick previous..master
git svn dcommit
git checkout previous
git merge --ff master
exit