代码之家  ›  专栏  ›  技术社区  ›  Stefan Kendall

Git到svn-管理文件

  •  4
  • Stefan Kendall  · 技术社区  · 14 年前

    也许我遗漏了一些关于通过svn使用gi的内容,但是如何在不将这些更改推到subversion的情况下保留一组本地修改的文件呢。

    这是我的工作流程。

    (on master) git svn rebase
    git checkout -b issue
    *apply changes I need on all my branches*
    *changes*
    git commit *changes*
    git checkout master
    git merge issue
    git svn dcommit

    问题在于,svn重设基础,甚至提交,我丢失了本地修改但没有签入的文件。我不想提交这些文件,因为我不想把它们拉到svn提交中。

    在这种情况下,我的工作流程应该如何工作?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Greg Hewgill    14 年前

    我的git svn工作流如下所示:

    (on master) git svn rebase
    git checkout work
    ... make commits for all changes, including local-only and those I intend to push up
    git checkout master
    ... cherry-pick changes from work branch
    git svn dcommit
    git checkout work
    git rebase master
    

    最后 rebase 步骤从工作分支中删除所有已经提交到上游的提交。

    cherry-pick 第二步,我实际上使用了一个小的shell脚本,它可以自动获取所有提交 那些在描述中没有“共同点”的人。你可以使用另一个指示符,比如“LOCAL”或者“NOPUSH”或者你喜欢的任何东西。这些提交是那些挂在“work”分支上的提交,不会被推到Subversion上。

    这是我的 pull-work 脚本:

    #!/bin/sh
    
    BRANCH=`git branch | grep ^\\* | cut -d' ' -f2`
    if [ $BRANCH != "master" ]; then
      echo "$0: Current branch is not master"
      exit 1
    fi
    
    git log --pretty=oneline work...master | grep -v -E '(NOCOMMIT|DEBUG):' | cut -d' ' -f1 | tac | xargs -l git cherry-pick
    

    tac 反转所列提交的顺序,以便它们以相同的顺序应用于主服务器。

        2
  •  2
  •   David M    14 年前

    听起来好像是你的脑袋被重置了。要避免这种情况,请使用 svn dcommit --no-rebase

    你应该用 git stash . 这将使您的新工作流:

    (on master) git svn rebase
    git checkout -b issue
    *apply changes I need on all my branches*
    *changes*
    git commit *changes*
    git checkout master
    git merge issue
    git stash
    git svn rebase
    git svn dcommit
    git stash apply
    

        3
  •  0
  •   shadowland    13 年前

    如果是回购中不存在的文件,您可以随时将其(或模式)添加到

    .git/info/exclude
    . 然后它将在git提交中被忽略,并且永远不会被推入SVN。