只有在给定提交后才能推送master

时间:2014-01-09 14:22:52

标签: git github git-push

我有一个本地git项目,我想通过推送到公共Github仓库来开源。让我们说这是本地项目的历史:

          F-G [feature-1]
         /   \
A-B-C-D-E     H-I-J   [master]
        ^
         \(first public ready commit) 

然而,我遇到了一个问题:在原型设计过程中,我已经对一些敏感数据进行了硬编码。让我们说代码中提交的D数据是我不希望任何人看到的。

如何在本地仓库中保留更改历史记录,但只能从E开始发布?

我正在考虑两种方法:

  1. E之前对提交进行压缩,这将使E成为初始版本。
  2. 制作某种类型的发布分支,稍后会开始master
  3. 命令行片段欢迎!

2 个答案:

答案 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的未来。