Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git svn:将现有git存储库的整个历史记录提交到一个空的Subversion子目录中_Git_Svn_Version Control_Git Svn - Fatal编程技术网

git svn:将现有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

我一直在计算机上本地编写一些代码,使用git(无远程)跟踪修改。 该代码现在将成为更大项目中的一个模块,其代码库存储在Subversion中(类似于
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不是一件小事,它可能会帮助其他人。编辑被拒绝,因此我将回答自己的问题。