自动存储库同步 Subversion 和存储库 Git

在我的项目中有一个存储库 Subversion 在网络文件系统中,新团队希望访问它 Git, 并且还能够修复它并从中接收更新。

我的意思是创造一个新的裸体
git-svn

-lon存储库 Subversion 在同一网络文件系统中,并确保这两个存储库始终与彼此相关联。

这样做的方法可能是在修复后添加钩子/犯罪/ 至于 Subversion, 所以对于一个新的存储库 Git, 这将更新另一个的存储库。

钩 Subversion post-commit 将包括
git svn rebase

, 和 Git - 一
git svn dcommit

.

问题是我必须使用一些阻止来确保在任何存储库中记录任何人,而另一个也没有固定,因为它们应该始终在任何固定之前同步/犯罪/. 它有几个缺点,其中固定所需的时间 Subversion 或者去存储库 Git /他必须等待完成钩子/, 以及一些用户无法运行的事实
git svn

/因为它没有安装在他们的车上/, 他们是什么意思,它们无法更新另一个存储库 committing/pushing.

如何解决这些问题? 钩子如何看起来像 Subversion 和 Git?
已邀请:

君笑尘

赞同来自:

这就是我想到的:

创建存储库
git-svn

, 如果他不存在:


git svn init --std-layout <svn_url> <git-svn_path>


分支
master

自动创建以跟踪
trunk

.

避免跟踪分支中的名称的歧义 Subversion, 使源分支 Subversion 显示为
remotes/svn/<branch name="">

: 转到新创建的存储库
git-svn

和推出


git config svn-remote.svn.fetch trunk:refs/remotes/svn/trunk
git config svn-remote.svn.branches branches/*:refs/remotes/svn/*
git config svn-remote.svn.tags tags/*:refs/remotes/svn/tags/*

rm .git/refs/remotes/*
git svn fetch


为颠覆性活动的每个分支创建子反转活动跟踪 :


for BRANCH in $/svn ls <svn_url>/branches//; do
git branch $BRANCH remotes/svn/$BRANCH
done


确保在中央存储库中 Git 没有创造的分支 non-Subversion-tracking:


# Used by hooks/update:
git config hooks.denyCreateBranch true
git config hooks.allowDeleteBranch false

cp .git/hooks/update.sample .git/hooks/update
chmod +x .git/hooks/update


允许移动到中央存储库 Git:


git config receive.denyCurrentBranch ignore
git config receive.denyNonFastForwards true
git config push.default current


并创建钩子 post-receive 重置并发送提交 Subversion:


cat .git/hooks/post-receive

#!/bin/sh

date &gt;&gt; receive.log
git reset --quiet --hard
while read LINE
do
BRANCH=${LINE##*/}
echo Updating $BRANCH
git checkout --quiet --force $BRANCH
git svn dcommit
done 2&gt;&amp;1 | tee -a receive.log
git checkout --quiet --force master

chmod +x .git/hooks/post-receive


重置是必要的,因为否则当前的分支是 out-of-date 每次接待后。

最后创建一个钩子以接收更新 CVS:


cat .git/hooks/svn-rebase-all

#!/bin/sh

date &gt;&gt; .git/svn-rebase.log
git reset --quiet --hard
for REF in .git/refs/heads/*
do
BRANCH=${REF##*/}
echo Updating $BRANCH
git checkout --quiet --force $BRANCH
git svn rebase
done 2&gt;&amp;1 | tee -a .git/svn-rebase.log
git checkout --quiet --force master

chmod +x .git/hooks/svn-rebase-all


并把它拿出来 Subversion post-commit:


cat <svn_path>/hooks/post-commit

cd <git_path>
. .git/hooks/svn-rebase-all

chmod +x <svn_path>/hooks/post-commit


而不是使用一个中央存储库
git-svn

您可以使用裸体中央存储库 Git 和中间不是裸体存储库
git-svn

, 怎么样
https://coderoad.ru/2014422/
.
我决定使用一个不是裸体的存储库
git-svn

, 哪个也是中央存储库。

任何人都可以使用项目 Git, 克隆
<git_path>

并向他迈向或使用 Subversion, 检查
<svn_url>

并固定它。
</svn_url></git_path></svn_path></git_path></svn_path></svn_url></branch></git-svn_path></svn_url>

三叔

赞同来自:

你最好要求每个开发人员学会使用
git-svn

直接地。 模型之间简单地存在太多阻抗不一致 git 和 SVN, 能够可靠地实现您正在寻找的内容。 使其工作的唯一方法甚至可靠地输入相同的限制
git-svn

, 但是有大量的运动部件可以破裂。 在我看来,您的版本控制系统并不是您希望至少部分可靠的事情。

或者,只是放弃 SVN 一般来说,并搬到了 git, 如果可能的话。

要回复问题请先登录注册