我的项目中出现了一些复杂的颠覆合并:长期分离的大分支.Svn给出了太多的冲突 - 其中一些似乎是虚假的.
鉴于git
对于优秀的合并体验而言,为了使合并更易于管理,使用git-svn
它是否有益?
你能推荐其他的替代品(如svk
,hgsvn
),以减轻疼痛合并?
有些冲突很容易解决(例如java导入,空格) - 所以我也想知道是否有任何自动解决方案.
将来可能会完全切换到DVCS(我们中的一些人会喜欢),但现在不行.(更新:这不再是真的 - 团队最近完全切换并对此感到高兴).
提前致谢.
PS:有些帖子似乎是相关的(例如git-svn合并2个svn分支),但他们没有完全回答这个问题.
更新:看完我的-novice-回答后再往下走(这个道路).
我有一个创建的本地git存储库git svn clone
.我创建一个本地分支,进行一些更改,切换回master,git svn rebase
如果一切都好,我将我的分支合并回master.然后树看起来像这样:
替代文字http://img.skitch.com/20090108-cjguu3hcci9x2k17mcftamw8f1.jpg
有时,稍后当我git svn rebase
再次进行一些远程更改时,它会失去a_branch合并到主线并且树看起来像这样的事实:
替代文字http://img.skitch.com/20090108-kn3bn1qgi5ijw8ja5ijkd75pa3.jpg
这是为什么?我可以阻止它吗?有没有一种简单的方法来判断分支是否已合并,或者在我完成时应该删除我的分支,所以我不会忘记已经合并了什么?
我已经阅读了很多关于git-svn
和合并的SO问题和博客.其中一些(特别是git-svn
手册页)警告不要在我计划的分支附近使用合并dcommit
.
其他人,比如这个SO答案,说明合并很好,只要我使用之前删除的一次性功能分支dcommitting
.
我有两个长寿SVN(和git)分支的设置:
svn/trunk
,git :) master
- 稳定分支svn/devel
,git :) devel
- 我从中分支功能分支的主要开发分支(我可以将它们重新定位devel
而不是合并).在上图中,(1)显示了过去的SVN历史,branches/devel
已合并到哪里trunk
.
(2)表明我已经成功将dcommitted
当前的开发重新纳入SVN.
问题:我可以git-svn
用来合并两个SVN分支,以便历史记录显示合并点(如SVN本身可以做的那样)吗?换句话说:如果我是dcommit
从(3)master
所示的那样会发生什么?
这会弄乱我的SVN(或git)历史吗?或者这只是简单地忘记了devel
被合并进去master
了吗?
编辑:如果git
只是忘记devel
合并master
,dcommiting
从点(3)到将所有提交作为单个补丁应用有区别吗?
我正在开发一个带有两个分支的svn项目,让我们调用它们
trunk
branches/foo
Run Code Online (Sandbox Code Playgroud)
我的想法是克隆整个svn存储库(告诉git哪个文件夹是主干,标签和分支),在git中进行合并然后将我的合并复制到svn工作副本并从svn提交更改.
在这个工作流程中,我是否可以使用gits合并功能,还是仅适用于使用git创建的分支?
我正在尝试git-svn
,并试图想出一个相对不容易出错的工作流程.我认为以下内容应该可行,并且非常简单,但我看到人们使用更复杂的工作流程,所以我想知道为什么.
(master) $ git svn init <path>
(master) $ git svn fetch
(master) $ git svn rebase
(master) $ git checkout -b topic-branch
(topic-branch) $ # HACK HACK COMMIT HACK HACK HACK COMMIT HACK COMMIT
(topic-branch) $ git checkout master
(master) $ git merge topic-branch
- 这是一个快进合并,所以没有合并提交(master) $ git svn rebase
(master) $ # fix conflicts
(master) $ git svn dcommit
GOTO 4
我和我的小团队在Git工作,而较大的团队使用Subversion.我想安排一个cron作业,HEAD
每小时将我们的存储库当前发布到SVN 仓库中的某个目录中.
我以为我已经想到了这一点,但我之前写下的食谱现在似乎没有起作用:
git clone ssh://me@gitserver/git-repo/Projects/ProjX px2
cd px2
svn mkdir --parents http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git svn init -s http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git svn fetch
git rebase trunk master
git svn dcommit
Run Code Online (Sandbox Code Playgroud)
这是我尝试时会发生的事情:
% git clone ssh://me@gitserver/git-repo/Projects/ProjX px2
Cloning into 'ProjX'...
...
% cd px2
% svn mkdir --parents http://me@svnserver/svn/repo/play/me/fromgit/ProjX
Committed revision 123.
% git svn init -s http://me@svnserver/svn/repo/play/me/fromgit/ProjX
Using higher level of URL: http://me@svnserver/svn/repo/play/me/fromgit/ProjX => http://me@svnserver/svn/repo
% git svn fetch
W: Ignoring error from SVN, path probably does not exist: (160013): …
Run Code Online (Sandbox Code Playgroud)