Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.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

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
git svn树的git克隆?_Svn_Git_Workflow_Git Svn - Fatal编程技术网

git svn树的git克隆?

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-

我有一个“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-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就像一辆会飞的汽车。每个人都想要一辆会飞的汽车,直到他们意识到一辆会飞的汽车跟汽车或飞机一样糟糕


真正的解决方案是尽快完全脱离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目录。