git svn:将现有git存储库的整个历史记录提交到一个空的Subversion子目录中
我一直在计算机上本地编写一些代码,使用git(无远程)跟踪修改。 该代码现在将成为更大项目中的一个模块,其代码库存储在Subversion中(类似于git svn:将现有git存储库的整个历史记录提交到一个空的Subversion子目录中,git,svn,version-control,git-svn,Git,Svn,Version Control,Git Svn,我一直在计算机上本地编写一些代码,使用git(无远程)跟踪修改。 该代码现在将成为更大项目中的一个模块,其代码库存储在Subversion中(类似于https://svnserver/svnroot/project/trunk/module_x),所以我想我可以使用git svn作为远程服务器来管理Subversion存储库。我记得以前在另一个项目中这样做过,但找不到操作方法(其间更换了计算机) 以下是我尝试过的: cd ~/mygitrepo/ git svn init https://svn
https://svnserver/svnroot/project/trunk/module_x
),所以我想我可以使用git svn作为远程服务器来管理Subversion存储库。我记得以前在另一个项目中这样做过,但找不到操作方法(其间更换了计算机)
以下是我尝试过的:
cd ~/mygitrepo/
git svn init https://svnserver/svnroot/project/trunk/module_x
git svn fetch
git svn rebase
最后一个命令产生以下错误消息:
Unable to determine upstream SVN information from working tree history
我在某个地方读到,这可能是因为子版本中的目录为空,所以我尝试分别向SVN提交一个虚拟文件,然后运行:
git svn fetch
A dummy.txt
r10744 = 89294ba713c6fed368f3b879c8dc7744b1015308 (refs/remotes/git-svn)
但是,我在我的git回购中找不到dummy.txt
文件,rebase
和dcommit
将继续显示相同的错误消息。
我做错了什么?您签出的分支不是来自subversion,因此
git svn
不知道如何使用它
然而,Git确实如此,所以您需要做的是使用普通的Git-rebase
将基础重新设置到Git-svn
(refs/remotes/Git-svn
)。然后,历史记录将包含来自subversion的提交,git svn dcommit
将知道在哪里提交它
另一件事是,在尝试重新设置更改的基础之前,需要将更改放置在正确的子目录中,因为
git-rebase
不支持移动到子目录中gitmerge
通过子目录
策略执行,但使用merge将作为单个提交导出到Subversion。如果您想导出完整的历史记录,并且在所有提交中都没有将其放在正确的目录中,则必须使用git filter branch
来修复它。您签出的分支不是来自subversion,因此git svn
不知道如何使用它
然而,Git确实如此,所以您需要做的是使用普通的Git-rebase
将基础重新设置到Git-svn
(refs/remotes/Git-svn
)。然后,历史记录将包含来自subversion的提交,git svn dcommit
将知道在哪里提交它
另一件事是,在尝试重新设置更改的基础之前,需要将更改放置在正确的子目录中,因为
git-rebase
不支持移动到子目录中gitmerge
通过子目录
策略执行,但使用merge将作为单个提交导出到Subversion。如果要导出完整的历史记录,但在所有提交中都没有将其放在正确的目录中,您必须使用git filter branch
来修复它。Jan提供的答案给出了我遇到的错误的原因,并指出普通的老git-rebase-on
是正确的解决方案,但缺少实际的命令
我最初建议将这些命令作为对他的答案的编辑,但被拒绝,因此:
git checkout -b svnrebase git-svn # create a temporary branch
git cherry-pick master~1 # cherry pick the first commit
git rebase --onto svnrebase master~1 master # rebase the 2nd through current commit
git svn dcommit # finally commit the results to svn
注意必须更改master~1
以引用您对git master的第一次提交。在这里,我们假设我们有一个git回购,只有两次提交
有必要创建一个临时分支并选择第一个提交给master,因为
rebase--ON
仅对master~1
之后所做的修改范围进行重新设置(并且master~2
引用不会只存在两次提交).Jan提供的答案给出了我遇到的错误的基本原理,并指出普通的老式git-rebase-on
是正确的解决方案,但缺少实际的命令
我最初建议将这些命令作为对他的答案的编辑,但被拒绝,因此:
git checkout -b svnrebase git-svn # create a temporary branch
git cherry-pick master~1 # cherry pick the first commit
git rebase --onto svnrebase master~1 master # rebase the 2nd through current commit
git svn dcommit # finally commit the results to svn
注意必须更改master~1
以引用您对git master的第一次提交。在这里,我们假设我们有一个git回购,只有两次提交
有必要创建一个临时分支并选择第一个提交给master,因为
rebase--ON
仅对master~1
之后所做的修改范围进行重新设置(并且master~2
引用不会只存在两次提交).感谢您提供了基本原理并为我指明了正确的方向,例如,git-rebase--on
。我编辑了您的答案以添加实际的命令序列,因为将初始提交重定到git svn不是一件小事,它可能会帮助其他人。编辑被拒绝,因此我将回答我自己的问题。感谢您提供基本原理并为我指出正确的方向,例如,git rebase--On
。我编辑了您的答案以添加实际的命令序列,因为将初始提交重定到git svn不是一件小事,它可能会帮助其他人。编辑被拒绝,因此我将回答自己的问题。