也许我错过了一些关于通过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提交。
我的工作流程应该如何在这样的情况下工作?
答案 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)
如果它是repo中不存在的文件,您可以随时将其(或模式)添加到
.git/info/exclude。然后它将在git提交中被忽略,并且永远不会被推送到SVN。