【发布时间】:2016-05-06 01:55:38
【问题描述】:
考虑以下问题:
- 在早期阶段包含一些凭据的私人项目
- 我们想要开源
- 我们需要摆脱历史中的凭据
- 凭据不在单个文件中,而是在代码中
- 包含多个合并、拉取请求等的复杂历史记录。
我想做什么:
将所有从 root 提交到具有 clean 状态的任意提交压缩到一个大的“初始提交”。
当我这样做时:
git rebase -i --root
然后将第一次提交压缩在一起:
pick Initial commit \
fixup dirty1 |
fixup dirty2 | Squash these to one, to remove credentials.
fixup dirty3 |
fixup clean1 /
pick clean2
pick clean3
...
...
我必须重新设置所有内容并在此之后再次解决所有合并冲突。
我怎样才能压缩前 N 次提交,而不必解决整个历史记录,包括 N + 1 次提交后的合并冲突。
【问题讨论】:
-
不幸的是,没有办法重写整个历史。这是因为当 clean2 获得它的新父级(被压扁的提交)时,它的哈希值发生了变化。这意味着 clean3 有一个新的父级,它会更改其哈希值,依此类推。
-
这样就好了。我只是不想再次手动解决每个合并冲突。
-
我赞成你的问题,但我认为你必须为历史中的每个后续提交处理冲突解决方案。虽然我从未使用过它,但我怀疑这将是 kernel.org/pub/software/scm/git/docs/git-rerere.html 的用例
-
嗯。我读了这个。而且我认为它不适用。在重新定位的分支上工作,
rerere的提交永远不会被解析,对吧? -
我找到了另一个解决方案:davidverhasselt.com/…。我用占位符替换凭据。