Git的。 svn dcommit用于git repos的模拟

时间:2011-07-13 21:49:00

标签: git git-svn

我想使用下一个典型的工作流程:

  1. 为功能创建新分支,并将其签出
  2. 在功能分支中提交
  3. 结帐大师
  4. 与功能分支合并。
  5. 推送更改
  6. 这是非常典型的用例。 然而,有一件事令我烦恼 - 我不想向公众展示我的分支机构。我只想推送合并提交,没有功能开发历史。

    可以建议使用git rebase和提交压缩。但事实上,这种挤压只是解决方法,而不是真正的解决方案。我希望我的所有提交都是localy,合并图,用于历史目的。

    我想通过git svn dcommit得到simmilar - 只有合并提交被推送到远程,但我看到localy完整的开发历史,具有功能提交,具有双父项合并节点和适当的合并图。 / p>

3 个答案:

答案 0 :(得分:0)

你可以尝试

git merge --squash <feature branch>

除了分支实际上不被视为合并之外,那将会做你想要的一切。

答案 1 :(得分:0)

如果我理解正确,您希望有一个提交(即一个SHA1),但您希望它在您的存储库副本上看起来与在中央副本上的不同。

这样做是不可能的。 Git是这样做的,这样就不可能了。如果您知道存储库中提交的SHA1 id,则可以确定您知道其所有历史记录。

但是,有一种方法可以伪造:使用grafts。这样,您可以在不实际修改提交的情况下向提交添加父级。虽然我不确定这是个好主意。

答案 2 :(得分:0)

根据您的评论,这是另一种解决方案:您可以在功能分支中工作,就像正常一样。合并功能根据需要分支到master,就像正常一样。在您推送到遥控器之前,请将壁球合并到一个单独的分支,然后将那个分支推送到遥控器。例如:

# Create two repos for testing
mkdir test-git-merging
mkdir test-git-merging2
cd test-git-merging2
git init
# Have to set this flag to be able to push with master checked out
git config receive.denyCurrentBranch ignore
cd ../test-git-merging
git init
# Base commit in first repo
git commit --allow-empty -m "init"
# Create the branch that will be pushed to the remote
git branch remote-master
# Make some files and commit them in master
echo foo >> foo
echo bar >> bar
git add .
git commit -m "added files"
# Make a change on a branch
git checkout -b branch
echo 1 >> foo
git commit -am "Modified foo"
# Make a non-conflicting change in master
git checkout master
echo 2 >> bar
git commit -am "Modified bar"
# Do a normal merge from branch to master--normal history
git merge branch
# Squash merge from master to special remote branch
git checkout remote-master
git merge --squash master
git commit -m "Everything is squashed"
# Set up the remote and push config
git remote add other ../test-git-merging2
git config branch.remote-master.remote other
git config branch.remote-master.merge master
git config push.default tracking
# Push the branch
git push

我已经测试了一系列命令,看它是否有效。当然,分支远程主设备仍然永远不会有真实的历史,这意味着将它从它返回到你的工作分支总是很危险的,但这基本上就是你所要求的。