2017-08-07 627 views
2

我一直在研究一个即将与其他开发人员共享的Git项目。我的项目中有一部分信息是我不允许分享的。如何在Git中删除项目的提交历史记录的一部分?

如果我的项目历史记录看起来像A→B→C→D→E→F,并且提交C和D中包含的信息是私有的,是否可以修改我的项目历史记录,看起来像A - > B - > E' - > F'(其中E'和F'是没有保密信息的E和F)在共享之前?

我的理解是,如果我在F和B之间执行手动合并来创建F',那么最终提交将是我想要的,但它不会保留项目历史记录。我认为它会看起来像A - > B - > F'而不是A - > B - > E' - > F'。

+0

可能的重复[删除敏感文件及其从Git历史提交](https://stackoverflow.com/questions/872565/remove-sensitive-files-and-their-commits-from-git-history) – phd

回答

1

我相信你正在寻找的是一个rebase。

如果提交C和D是自包含的,即如果提交E和F不需要提交E和F,则应该没问题。

适当的语法是:

$ git rebase --onto B D F 

其中B,d和F是任一散列或这些提交的参考文献。

如果这些提交已经被推送到公共存储库,请务必小心,因为已提交的提交的重写历史记录通常是危险的并且是不鼓励的。

0

有完成此操作的简单和复杂的方法。这里有一个非常简单的方法,它可以让你轻松地用grep比较麻烦的片段来验证他们的缺席。

创建一个新的回购分享。 (您可以在其中存储历史记录F'快照并完成,但您希望保留一些历史记录。)

在旧回购中使用git format-patch来存储A,B,E',F'的差异/ tmp目录。

使用git am将这些差异应用于新回购。发布它。

0

有一个强大的工具,允许您删除敏感信息,不管提交什么提交它:BFG,The Big Repo Cleaner

BFG将允许您选择性删除您的回购历史记录中的敏感信息。例如,您可以使用它删除错误地添加到存储库的文件。它还将允许从存储库中的文件历史记录中删除特定的字符串。

BFG优于其他方法的优势在于它在不影响不担心的提交的情况下擦除历史记录。但是,它会更改存储库中已提交的某些提交的提交id。详情请参阅其常见问题

相关问题