是否有规范的方式可追溯地将git repo拆分为公共和私有变量?

时间:2018-10-25 02:32:59

标签: git publishing privacy computer-forensics git-reflog

我有一个git存储库,其中包含一些文件,这些文件包含一些可能经过硬编码或正式硬编码的敏感数据,现在位于git历史记录中的某些位置。

为了使该项目公开可用,以便具有相似兴趣的程序员可以从中受益并贡献所做的更改,我想对其进行分叉以清理有问题的文件。

我考虑的过程如下:

  1. 浅/共享将存储库本地克隆到新的本地位置,此文件夹将成为公共变量。后续步骤在新的存储库中。
  2. 将母版分支到分支public-master
  3. 删除所有其他分支引用。
  4. 消毒public-master
  5. 南瓜public-master
  6. git reflog expire --expire-unreachable=now --all && git gc --prune=all --agressive删除所有无法访问的引用,这是公共分支中不在的所有obj
  7. git push将上游的公共母版重新添加到私有存储库中。
  8. 将源远程设置为公共仓库URL,分支到master。推到原点。

这足以清理我的仓库,还是可以在此之后恢复敏感数据。有没有更明智,更通用的方法来解决此问题?是否有任何多余的步骤?

例如,我可以在一个存储库中完成所有操作吗,还是git-packs的性质意味着我仍然可以推送包含敏感信息的obj

2 个答案:

答案 0 :(得分:2)

  

唯一的问题是我希望能够从私有存储库中提取信息,然后它们将具有未共享的历史记录。

这似乎是不可避免的,因为您已经更改了分支历史并对其进行了压缩。

我不会从新的公共存储库中撤出,而只是考虑对一个新的存储库克隆所做的更改,然后决定要添加到旧私有存储库的本地克隆中的一个:

# update local content of new repo
cd /path/to/public/repo 
git pull

# check what needs to be added
cd /path/to/clone/of/old/repo
git --work-tree=/path/to/public/repo add -p .

您将看到新旧之间的差异,这是由公共存储库上可能进行的新改进所致。

答案 1 :(得分:2)

结合@VonC和@ b-fg答案我认为最明智的解决方案如下。 可以发现,很容易用可能包含敏感日期的obj污染新的公共存储库,而建立一个新的公共存储库即可。

  1. 将专用存储库分支到public
  2. 消毒public
  3. 为公众创建新的仓库。
  4. git --work-tree=/path/to/private add -p .使git与公共索引一起运行,但私有的工作树已运行。现在,公共仓库已将清理过的分支机构的所有工作树都上演了git commit
  5. 本地存储库在索引中具有清理过的分支中的工作树,但没有工作树,换句话说,它看起来像git,就像当前工作树中的所有内容都已从索引中删除一样。使用git reset --hard
  6. 将文件“ 还原”到新存储库的工作树中
  7. 切换回私有存储库,并将公共存储库添加为远程存储库。 git remote add public file://path/to/public/repo
  8. 历史记录private/publicpublic/master现在不相交了。因此,我们需要将它们嫁接在一起。现在使用private/public设置git branch -u public master的上游,拉出历史记录git pull --allow-unrelated-histories
  9. 将公共分支设置为仅能够读取更改,而不能写入更改,以防止意外污染公共仓库git remote set-url public --push "This Branch is Read-Only"

现在仅在公共存储库中启用新功能,然后根据需要将其拉回私有功能中。