我有一个'git-svn'工作树。我想克隆一个“纯”的git repo,然后使用git push / pull在git-svn树和git树之间移动更改,同时还使用'git svn dcommit / rebase'来移动git-svn树和它所基于的SVN repo。
这似乎可以正常使用git方法在git树之间来回移动东西,但是当我在git-svn树中与SVN repo交互时,事情变得很糟糕 - 我得到错误当在git树之间推或拉时,或者我在git-svn树中丢失了提交,或者其他奇怪的事情。
这种类型的SVN< - > git-svn< - >完全支持git工作流程,还是应该退出这棵树?
答案 0 :(得分:9)
我为我的一些项目设置了桥接器,但它只是从git到svn的单向路径(提供我们的git master分支的公共只读SVN镜像)。但是,既然它工作正常,它可能会帮助你或者在你的双向场景中指向正确的方向,因为我认为是git-> svn会产生问题,而不是svn-> git:
我的单向场景:github上的现有git存储库,需要一个git master分支的只读svn镜像
在服务器上创建并初始化目标subversion存储库:
svnadmin create svnrepo
mkdir trunk
svn import trunk svn://yoursvnserver/svnrepo
rmdir -rf trunk
创建混合Git-Svn签出并初始化subversion存储库
git svn clone svn://yoursvnserver/svnrepo/trunk
cd trunk
git remote add github git://github.com/yourname/repo.git
git fetch github
git branch tmp $(cat .git/refs/remotes/github/master)
git tag -a -m "Last fetch" last tmp
INIT_COMMIT=$(git log tmp --pretty=format:%H | tail -1)
git checkout $INIT_COMMIT .
git commit -C $INIT_COMMIT
git rebase master tmp
git branch -M tmp master
git svn dcommit --rmdir --find-copies-harder
更新镜像
git fetch github
git branch tmp $(cat .git/refs/remotes/github/master)
git tag -a -m "Last fetch" newlast tmp
git rebase --onto master last tmp
git branch -M tmp master
git svn dcommit --rmdir --find-copies-harder
mv .git/refs/tags/newlast .git/refs/tags/last
googlecode的这两篇文章也可能有所帮助:
答案 1 :(得分:9)
可能导致您麻烦的一件事是git svn dcommit
将重写它发送给SVN的所有提交 - 至少如果它被配置为将SVN元数据注释添加到提交消息的底部。所以你必须采用一个流程,任何从你的git-svn工作区提交的存储库都会对它进行反对,丢失所有无法存储在SVN中的合并历史记录。
答案 2 :(得分:5)
基于我所看到的,git-svn不支持此工作流,并且由于SVN表示合并的方式,因此不会支持此工作流。
答案 3 :(得分:3)
正如我经常在#git上说的那样:
git-svn就像一辆飞行汽车。每个人都想要一辆飞行汽车,直到他们意识到飞行汽车非常糟糕,无论是汽车还是飞机。
真正的解决方案是尽快完全摆脱SVN。使用git-svn进行一次性迁移,然后将所有人移动。 Git 不很难学。
答案 4 :(得分:2)
如果您能够在Subversion存储库中安装自定义挂钩,请考虑使用SubGit。
SubGit是一种服务器端解决方案,可自动同步SVN和Git存储库。要安装SubGit,请执行以下操作:
$ subgit configure $SVN_REPOS
$ # Adjust $SVN_REPOS/conf/subgit.conf
$ # to specify your branches and tags
$ # Adjust $SVN_REPOS/conf/authors.txt
$ # to introduce svn author names to their git counterparts
$ subgit install $SVN_REPOS
$ ...
$ INSTALLATION SUCCESSFUL
此时SubGit已经安装了由每个svn commit
和git push
触发的挂钩。这样SubGit就可以转换任何传入的修改。
另请参阅与git-svn的比较。
答案 5 :(得分:1)
使用git和git-svn 1.7.1,似乎我刚做的测试似乎工作正常。
git svn init [url]
git svn fetch
然后你必须创建并签出一个虚拟分支才能推送到主分支。
git checkout -b dummy
然后你可以将它(git clone ...
)克隆到另一个纯git repo中,修改它,提交它(git commit
)然后将(git push
)推入git-svn repo。 / p>
回到git svn repo:
git checkout master
git svn dcommit
将提交已推送的所有git提交。