我有一个本地git项目,我想通过推送到公共Github仓库来开源。让我们说这是本地项目的历史:
F-G [feature-1]
/ \
A-B-C-D-E H-I-J [master]
^
\(first public ready commit)
然而,我遇到了一个问题:在原型设计过程中,我已经对一些敏感数据进行了硬编码。让我们说代码中提交的D数据是我不希望任何人看到的。
如何在本地仓库中保留更改历史记录,但只能从E
开始发布?
我正在考虑两种方法:
E
之前对提交进行压缩,这将使E
成为初始版本。master
。命令行片段欢迎!
答案 0 :(得分:2)
在这种情况下,我会使用移植文件并重写:
首先,标记D和E.我假设它们可以从这里被称为D和E.
现在,伪造E的历史,以便它没有父母:
git rev-parse E >.git/info/grafts
然后,重写提交以反映此历史记录:
git filter-branch -- --all
现在,您有一个指向敏感数据的本地标记D,以及一个指向干净数据的本地标记E作为初始提交:
F'-G' [feature-1] / \ E' H'-I'-J' [master] A-B-C-D
现在,根据您的本地需求,让E'再次显示D作为父母可能会有所帮助,这可以再次使用移植文件来完成:
echo `git rev-parse E` `git rev-parse D` >.git/info/grafts
请注意,不现在想要运行git filter-branch
。
在本地,您的历史记录将如下所示:
F'-G' [feature-1] / \ A-B-C-D-E' H'-I'-J' [master]
但如果你推,你会推动真正的 E',它没有父母,所以远程,你只能得到
F'-G' [feature-1] / \ E' H'-I'-J' [master]
答案 1 :(得分:1)
我要离开@ hvd的答案作为公认的答案,因为太棒了。
但是,由于我的特定用例是删除敏感数据,因此我选择了Githubs guide for just this case中列出的路线。具体来说,使用BFG:
cd repo_dir
wget http://repo1.maven.org/maven2/com/madgag/bfg/1.11.0/bfg-1.11.0.jar
echo "PASSWORD1" >> passwords.txt
echo "KEY_1==>KEY_FOR_SERVICE_1" >> passwords.txt
java -jar bfg-1.11.0.jar --replace-text passwords.txt .
rm passwords.txt
rm bfg-1.11.0.jar
对于任何想要做类似事情的人来说,这只是一次性的,但我肯定会继续坚持BFG的未来。