Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.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
Svn 预先向Git存储库的根目录提交一次提交/将Git导出到Subversion_Svn_Git - Fatal编程技术网

Svn 预先向Git存储库的根目录提交一次提交/将Git导出到Subversion

Svn 预先向Git存储库的根目录提交一次提交/将Git导出到Subversion,svn,git,Svn,Git,我想将Git存储库(G)导出到SVN存储库(S)S已使用标准布局(分支/标签/主干)进行初始化,G具有迄今为止的开发历史。我遵循了中的建议,其中详细介绍了如何导出G→ S有效。基本上,博客建议git svn cloneS到一个空目录中,fetchG到一个临时目录中。将其分支并重新设置为“master”,从而成为第二个Git存储库(G') 我既不想放弃不受源代码控制的文件,也不想放弃在origin上不可用的分支。这就是为什么我不想继续使用G',而是使用G。是否有方法取回表示提交到S的布局的新提交?

我想将Git存储库(G)导出到SVN存储库(SS已使用标准布局(分支/标签/主干)进行初始化,G具有迄今为止的开发历史。我遵循了中的建议,其中详细介绍了如何导出GS有效。基本上,博客建议git svn cloneS到一个空目录中,fetchG到一个临时目录中。将其分支并重新设置为“master”,从而成为第二个Git存储库(G'


我既不想放弃不受源代码控制的文件,也不想放弃在origin上不可用的分支。这就是为什么我不想继续使用G',而是使用G。是否有方法取回表示提交到S的布局的新提交?我尝试将G'合并到G(当然没有共同的祖先)。

您应该能够使用
git merge--strategy=ours
G'G合并,也就是说,忽略祖先并创建一个使用G'树的提交,但似乎将两个提交都作为父级。结果会有点难看,因为历史记录将包含每个提交的两个副本,但您应该能够继续无缝地处理G

我不确定是否有更简单的方法来添加初始提交,但有一种相当简单的方法可以让它看起来好像SVN布局从一开始就在那里一样

您可以使用
git filter branch
重写历史记录,以便从第一次提交开始,每个文件都存在于SVN“trunk”目录下:

git filter-branch --tree-filter 'mkdir trunk; git ls-files | xargs -I {} mv {} trunk'

如果愿意,您也可以将文件移动到标记和分支目录中,但如何决定将哪些文件移动到该目录将完全取决于分支的用途,或者何时将标记添加到历史记录中。

问得好,我试图学习如何使用git plus与svn集成,但同时也很困惑。我希望有更好的东西。下面的[1]完美地保存了历史记录-此外,唯一需要的是git svn需要识别的单个提交。考虑到git工具包的丰富性,应该可以在我的历史记录中预先添加这些内容。严格地说,预先添加是不可能的,因为提交的标识取决于其父级的标识(s)。我能想到的唯一方法是将所有其他分支重新设置到S上。非常有趣!我将在早上第一件事尝试!我没有正确阅读您的答案-我真正想要的是表示git svn初始布局的提交,而不是布局本身。不过,过滤器分支+1。@yawn:为什么不创建svn标准布局呢在一个新的(或者是空的)Git repo(让我们称之为repo“T”)中进行提交,然后将T的master提取到G中。然后在G中,将master从fetch_HEAD中重新设置基址?在G中,您想要保留的任何其他分支,以及从新的“初始”提交中派生出来的分支,您也必须重新设置基址(但是,对于每个分支,您必须找到与分支的原始基相对应的新提交)。