如何在 svn 上,在 Windows 上,用一个裸仓库镜像 git

Posted

技术标签:

【中文标题】如何在 svn 上,在 Windows 上,用一个裸仓库镜像 git【英文标题】:How to mirror git on svn, on Windows, with a bare repo 【发布时间】:2021-02-03 23:40:38 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

我发现最接近我想要的是here,但我遇到了与那里的 cmets 中的某人相同的问题:SVN 日志被合并消息污染。

主要问题是拥有两个完全独立的历史,并且无法永久合并它们。 git-svn 必须从现有的 svn 存储库开始,因此初始提交来自那里。但我不想永久重写我的 git repo 的历史,以使其基于 SVN 初始提交。

This 回答让我走了很多路,我以为我已经完成了,在第一次同步时,这很好,但问题是它试图将所有历史记录从 git 重新定位到svn 分支,即使该分支已经包含大部分历史记录。这最终会尝试进行“向后”合并(将文件的旧版本合并到新版本中),这会产生无法解决的冲突(您每次都必须再次这样做)。

所以我改用樱桃采摘了。

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

创建裸 git repo

#(create and cd to a test folder)
git --bare init bare.git

创建本地 git 工作仓库

#(cd to test folder)
mkdir gitrepo
cd gitrepo
echo 'First content' > file.txt
git add .
git commit -m "Initial git commit"
git remote add origin [absolute path to bare.git]
git push origin master

至此,添加到本地git working repo的新文件已经同步到bare repo了。

创建空的颠覆

svn mkdir --parents [path to desired svn repo including /trunk] -m "Initial commit"

将裸机克隆到镜像仓库中

#(cd to test folder)
git clone [absolute path to bare.git] mirror
cd mirror
code .git\config # I'm using VSCode here: edit with whatever you want

将以下行添加到文件中:

[svn-remote "svn"]
    url = [path to svn repo including /trunk]
    fetch = :refs/remotes/git-svn

提交到 svn

git svn fetch
git rebase --onto remotes/git-svn --root master 
git svn dcommit

这会从 svn 获取空的“第一次提交”,将所有从裸仓库克隆的更改重新定位到它,然后 dcommits 回到 svn。此时所有的 repos 都已同步。

(请注意,对于具有大量历史记录的现有存储库,如果 master 的过去历史记录中有分支/合并,则可能需要进行一些手动合并。

设置必要的分支

初始设置给我们留下了master 指向svn。所以

git checkout -b svn
git checkout -B master origin/master
git checkout -b previous

想法是svn 分支跟踪svn 远程,master 跟踪origin/master,previous 指向master/svn 的最后同步。通过这种方式,我们可以使用从previousmaster 的提交范围来确定要挑选的内容。

设置钩子

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

#!/bin/sh
#
# After receiving pushed commits, move to Mirror 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 没有备份,我仍然有我的本地 git 源,并且管理层认为也许 git 毕竟不是那么糟糕 :) (换句话说,我们不再使用SVN,所以我们不再需要这个镜像了)。

以上是关于如何在 svn 上,在 Windows 上,用一个裸仓库镜像 git的主要内容,如果未能解决你的问题,请参考以下文章

如何在windows上安装部署设置SVN服务器

如何在windows上安装部署设置SVN服务器

如何在windows上安装部署设置SVN服务器

如何在 Windows 服务器上使用 collabnet subversion edge 设置 SVN 服务器,以及如何在 Mac 上使用 Xcode 远程连接到它?

如何在WIndows电脑上安装 SVN Server 实现代码版本控制

怎样在windows上设置svn服务器