【问题标题】:How to deal with Git-svn when have to use both Git and Subversion当必须同时使用 Git 和 Subversion 时如何处理 Git-svn
【发布时间】:2012-04-12 02:15:55
【问题描述】:

[更新]

关于更多细节,我尝试在家做纯 Git 的原因是,我的公司想迁移到 Git,但经理不想做出改变,因为开发人员不了解我们的 Git。自己的存储库。所以,我尝试做的是,我尝试让每个人都使用 Pure git,同时有人可以在这个学习阶段合并回 Subversion。因此,在任何紧急情况下,他们仍然可以使用 Subversion。

所以,在大家熟悉 Git 之前,我不能将存储库转移到使用纯 Git。因此,它将同时更新 Subversion 和 Git。 (现在的主存储库是 Subversion)。因此,我尝试通过 dcommit 将存储库同步回 Subversion,从而使 Git 能够顺利运行。

[问题]

我在使用 Subversion 作为存储库的组织中,所以我将它作为我的个人 Git 转储(并计划在未来使用 Git 替换 Subversion)

现在,我有一个同时使用 GitSubversion (Main Source) 的存储库。当我必须同时使用 git 和 subversion 时,我遇到了处理 git svn rebase 的问题。

我的工作流程如下

在办公室

  1. Repository 有 Git-svn 接口
  2. 我总是从这里使用 git svn dcommit 将代码提交到 Subversion。
  3. 我在 Bitbucket 上推送到我的远程 git 存储库

在家

  1. 我从 Bitbucket 克隆存储库
  2. 使用并致力于 Bitbucket

现在,回到办公室

  1. git 拉
  2. git svn rebase
  3. git svn dcommit
  4. git 推送

在第 4 步中。我有一个问题,我已经重新建立了我的分支

现在问题来了,当我回到家时

当我回到家时,我不能使用“git fetch”,因为分支已经重新设置了基础。所以,我必须用 git branch -D ..... 删除分支,然后再次 git checkout

所以,我寻找我们可以同时使用 Git 存储库和 Subversion 的方法,并在使用 git svn rebasegit svn dcommit完成操作后使用 Git >.

注意。我不会喜欢在家里使用任何 git-svn。尝试继续只使用 Git。

【问题讨论】:

    标签: git svn git-svn


    【解决方案1】:

    我认为您的问题的主要原因是git svn dcommit 更改了提交消息以包含 SVN 提交数据。由于消息包含在提交的 SHA1 中,因此此更改在 git 看来是完全不同的提交。

    我的解决方案是在您的办公室存储库中有一个与 SVN 同步的分支和另一个(纯 git)分支来完成您的工作。每当您想与 SVN 存储库交换某些东西时,您都会合并一个或另一个方向。

    就我而言,我设置了另一个专门用于 SVN 交换的 git 存储库。我有一个 cron 作业,它每 15 分钟将 repo 与 SVN 服务器同步一次。这样我就不会错过git svn rebase

    【讨论】:

      【解决方案2】:

      好的,您的主要问题似乎是您无法真正在家中执行git pull,因为历史已被重写(实际上它应该可以工作,但它会尝试进行不必要的合并)。

      解决该问题的最简单方法是使用git pull --rebase。这样,您无需将在家中所做的提交与远程分支的尖端合并,而是将自分支创建以来所做的每个提交都重新设置在分支的尖端。 Git 会很聪明地看到一些提交是完全相同的,并且它们会在 rebase 期间被自动修剪。

      【讨论】:

      • 我对 git pull --rebase 命令感兴趣。如果我已经完成了 git svn dcommit,这仍然有效吗?因为 sha1 在那之后发生了变化。
      • 当您执行pull --rebase 时,它会尝试根据您的远程分支的当前提示重新设置您的提交。所以是的,它会起作用。
      【解决方案3】:

      实际上,您应该可以使用git fetch,但您可以使用git rebase origin/branch,而不是与git merge origin/branch 合并。那应该可以解决您的问题

      如果尝试git fetch 没有帮助,那么git checkout -f -B branch origin/branch 最后一个命令将强制从远程分支覆盖本地分支。

      【讨论】:

        【解决方案4】:

        毕竟你没有提到你为什么要保留 svn。但我的建议是一劳永逸地从一个干净的 git repo 开始。并避免不必要的问题。

        我相信 Casey 对迁移到 git 做出了最好的回答: How to migrate SVN repository with history to a new Git repository?

        当然,您必须进行备份,然后开始该过程。

        另一个想法是,如果rebase是问题所在,为什么不使用纯svn更新,然后将更改提交到Git(仅git commit),就像你自己写的一样。

        【讨论】:

        • MacroA,如果是我自己的仓库,一切都很容易管理。但是当你在大型开发团队的公司工作时。你需要的东西很难做到。仍然有很多存在依赖于他们这样的部署系统。除非一切都准备好迁移,否则某些事情不会中断。
        【解决方案5】:

        Version Control with Git 书中找到了解决方案。第 295 页。

        不使用本地-master 分支,必须签出远程分支

        git checkout remote/master (Detach HEAD)
        git merge --no-ff master (merge the local master)
        git svn dcommit
        git push origin (update to git Repository)
        

        此模型适用于将合并回 Subversion 存储库的人,而其他人则在纯 Git 或纯 Subversion 上工作。通过这种方式,Git 用户可以在没有合并问题的情况下使用 Git。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-19
          • 1970-01-01
          • 2012-07-24
          • 2015-06-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多