git svn树的git克隆?
我有一个“git svn”工作树。我想在此基础上克隆一个“纯”git回购,然后使用git推/拉在git svn树和git树之间移动更改,同时还使用“git svn dcommit/rebase”在git svn树和它所基于的svn回购之间移动更改 就使用git方法在git树之间来回移动而言,这似乎是可行的,但一旦我在git SVN树中与SVN repo交互,事情就会变得不稳定——或者在git树之间推拉时出错,或者在git SVN树中丢失提交,或者其他奇怪的事情git svn树的git克隆?,svn,git,workflow,git-svn,Svn,Git,Workflow,Git Svn,我有一个“git svn”工作树。我想在此基础上克隆一个“纯”git回购,然后使用git推/拉在git svn树和git树之间移动更改,同时还使用“git svn dcommit/rebase”在git svn树和它所基于的svn回购之间移动更改 就使用git方法在git树之间来回移动而言,这似乎是可行的,但一旦我在git SVN树中与SVN repo交互,事情就会变得不稳定——或者在git树之间推拉时出错,或者在git SVN树中丢失提交,或者其他奇怪的事情 这种类型的SVN-git-SVN-
这种类型的SVN-git-SVN-git工作流是否完全受支持,或者我应该停止使用这棵树吗?我的一些项目有一个桥接设置,但从git到SVN只是单向的(为我们的git主分支提供一个公共的只读SVN镜像)。但是,由于它工作正常,它可能会帮助您或为您指明双向场景中的正确方向,因为我假设是git->svn产生问题,而不是svn->git: 我的单向场景:github上现有的git存储库需要git主分支的只读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
真正的解决方案是尽快完全脱离SVN。使用git svn进行一次性迁移,然后将所有人移到上面。Git并不难学。可能会给您带来麻烦的一件事是,
Git svn dcommit
将重写它发送给svn的所有提交-至少如果它配置为将svn元数据注释添加到提交消息的底部。因此,您必须采用这样一种流程,即任何从git svn工作区获取提交的存储库都会根据它重新设置基础,从而丢失所有无法存储在svn中的合并历史。使用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中
回到git svn回购协议:
git checkout master
git svn dcommit
将提交所有已被推送的Git提交。
< P>如果您能够将自定义钩子安装到StaseStaveRooStk中,请考虑使用.< /P> 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提交
和git推送
触发的钩子。这样子Git就可以转换任何传入的修改
另请参见与的比较。因此,这个问题在这里有一个答案,持续了将近一年,我最后添加了一些内容,这样我就有了一些合理正确的内容可以接受(克里斯托夫没有冒犯),然后两个人从木制品中跳出来,提供我发布的相同内容的版本。令人惊叹的。您真正的解决方案假定您可以选择远离Subversion。除了“换一份新工作”,有时候不是。我对这个答案投了赞成票,因为我认为它通常是有用的,但它基于一个有缺陷的前提。问题几乎肯定不是git->svn,也不是svn->git,至少不是直接的。相反,git svn->git步骤将是问题所在,因为svn->git正在重写历史,这意味着两个存储库将不再具有相同的历史,生活将变得混乱。投票通过,因为这可能是问题的真正原因,至少根据我对问题的理解,这并不能解决问题。当您编写时,没有单独的git目录。