代码之家  ›  专栏  ›  技术社区  ›  baudtack

Git Svn数据提交单个Git提交

  •  26
  • baudtack  · 技术社区  · 15 年前

    给定多个未处理的 git 承诺,有没有可能 git-svn dcommit 只有一个承诺?

    例如,我有commit foo、bar和baz,但现在我只想让bar在svn repo中结束。这有可能吗?

    4 回复  |  直到 7 年前
        1
  •  27
  •   Mark Visser    13 年前

    (以下假设您的工作正在进行 master 。)

    首先,重新排序最后三次提交,以便 bar 首先。

    git rebase -i HEAD~3
    

    编辑器将弹出如下内容:

    pick 498e4f4 foo
    pick 71547ae bar
    pick abf09c6 baz
    
    # Rebase 4d3fe72..abf09c6 onto 4d3fe72
    #
    # ...
    

    在弹出的编辑器中重新排序,以便 酒吧 排在第一位。

    pick 71547ae bar
    pick 498e4f4 foo
    pick abf09c6 baz
    
    # Rebase 4d3fe72..abf09c6 onto 4d3fe72
    #
    # ...
    

    Git会旋转几秒钟,然后打嗝确认:

    Successfully rebased and updated refs/heads/master.
    

    现在您可以临时回滚到 酒吧 提交( HEAD~2 意味着从 HEAD )和数据传输:

    git checkout HEAD~2
    git svn dcommit
    

    如果你像我一样偏执,你可以 git svn dcommit -n 首先要确保你只承诺你想要的。

    现在跳回到 主人 :

    git checkout master
    

    最后一个位是重新平衡,以便 主人 与SVN同步:

    git svn rebase
    

    为什么需要这样做对我来说有点模糊,但我猜想在一个分离的头部状态下的数据传输与此有关。

        2
  •  13
  •   Pradeep    15 年前

    git svn dcommit不能有选择地提交BAR。如果您已经在主分支上直接提交了foo、bar和baz,那么您必须执行以下操作才能在SVN中只获得bar。

    假设bar的commit sha类似于13abc…

    GitLogMaster显示了所有3个提交的foo、bar和baz。

    • 您需要从master创建一个分支

      GIT分支在制品

    WIP分公司现在有FOO、BAR和BAZ。

    • 在任何foo、bar或baz之前将master的头部重置为commit。你可以用 git reset (阅读手册,硬选项、软选项和混合选项之间的差异会影响工作树中未提交的更改)

      git reset—硬(foo、bar、baz之前的commit-id)

      (或)

      Git Reset--硬头~3(返回3次修订)

    现在你的总分行没有foo、bar或baz。使用Git日志进行验证。

    • 现在,您可以只选择希望从WIP分支向master提交到SVN的提交。所以得到酒吧

      Git Cherry Pick WIP 13ABC(酒吧提交的sha)

    主服务器只获得BAR提交。

    • 现在git svn dcomit应该单独推条。

    建议未来使用

    因此,对于Git SVN,最好不要直接在跟踪远程SVN的主分支上进行提交。在数据提交之前,对本地分支进行操作并有选择地合并到master。

        3
  •  4
  •   baudtack    15 年前

    我有一种尖锐的回答。您可以创建一个新的分支,其中包含foo、bar和baz,然后 cherry-pick 到新的分支然后 git-svn dcommit 那根树枝,做完后再把它拔下来。不过,这看起来不太优雅。

    所以假设foo、bar和baz在分支X中,master没有任何分支。

    git branch y master

    git checkout y

    git cherry-pick <sha1 of bar>

    git svn dcommit

    git checkout x

    git svn rebase

    git branch -d y

    如果master有这些提交,您可以按照sizzler的建议重置头部。

        4
  •  2
  •   René Link    7 年前

    我有时只想对我的分支进行一些承诺。例如。

    A-----B-----C------D  
    ^                  ^
    |                  |
    svn/trunk          trunk
    

    如果我想承诺 B C 但不是 D 我创建了一个新的分支,做一个 svn dcommit ,切换回 trunk 删除分支。

    当我在分店的时候 大旅行箱 我愿意

    git checkout -b temp `C`
    git svn info // just to check that branch temp is properly connected to svn
    git svn dcommit
    git checkout trunk
    git branch -D temp
    

    编辑

    就像斯蒂芬评论的那样:

    再加上一个“git-svn-rebase”,对我来说效果很好。

    这是必要的,因为提交给SVN的提交将被重写。 git-svn 添加 git-svn-id 提交消息,因此即使提交的内容相同,提交哈希也会更改。但是由于内容是相同的,所以钢筋不会引起冲突。

    附言:我也经常 省略新分支 而且只是 已分离签出 .例如。

    git checkout --detach C
    git svn dcommit
    git checkout trunk
    git svn rebase