我的代码库是 SVN,我使用 git 进行所有开发。我们有一个标准的布局,我用 git svn init -s <url to repo>
初始化了我的本地仓库。
这是我使用分支的工作流程:
# creates a new branch remotely
git svn branch new-branch-name
# switches to a branch or trunk locally
git reset --hard name-of-branch
git reset --hard trunk
# merge changes from trunk into a branch
git reset —hard name-of-branch
git merge trunk
git svn dcommit
上面的最后一个命令会将更改提交到分支名称的分支。我的问题是,git 是怎么知道的?当我做 git reset --hard foo
,到底发生了什么?
这可能只是关于 git 的一般问题。每次我尝试研究答案时,我都会对 svn 集成是否是特例感到困惑。
最佳答案
git-svn
将查找对应于事件 SVN 分支的祖先提交的提交树(refs/remotes/...
分支对应于分支SVN)。然后它将提交给那些。
请注意,您不应该先 merge 再提交——SVN 和 Git 的分支模型不匹配,这种事情会破坏您的 SVN 历史记录。当你在分支上时,你应该改为 git rebase trunk
。 (或者,git svn rebase
。)
此外,请注意,您在 rebase 之前 checkout 的分支应该是本地分支。如果不是,您可以使用 git checkout -b local-branch-to-create remote-branch
创建一个。然后 git rebase trunk
。
如果你想将所有 rebase 的提交压缩为一个,那么在 rebase 之后执行此操作:git reset --soft trunk && git commit
。
一旦您对现在位于主干之上的提交感到满意,只需 git svn dcommit
将它们推送到 SVN 服务器。
关于svn - git-svn 如何知道要提交到哪个分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4168411/