Git通过svn - 管理文件

时间:2010-08-02 21:00:21

标签: svn git workflow git-svn

也许我错过了一些关于通过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 rebase,甚至提交,我丢失了我的本地修改但未签入的文件。我不想提交文件,因为我不希望它们被拉入svn提交。

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

3 个答案:

答案 0 :(得分:2)

我的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脚本,它自动获取所有提交,但在其描述中包含“NOCOMMIT”的提交。你可以使用另一个指标,如“LOCAL”或“NOPUSH”或任何你喜欢的。这些提交是那些在“工作”分支上徘徊并且没有被推到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这样的细微内容来反转所列提交的顺序,以便它们以相同的顺序应用于master。

答案 1 :(得分:2)

听起来好像正在发生的是您的HEAD正在被重置。为避免这种情况,请使用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

恰当地命名你的藏匿处,你应该能够做你正在做的任何事情。

答案 2 :(得分:0)

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

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