1

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

为了使项目公开可用,以便具有相似兴趣的程序员可以从中受益并回馈更改,我想分叉它以清理有问题的文件。

我考虑的程序如下:

  1. Shallow/Shared 将 repo 本地克隆到新的本地位置,此文件夹将成为公共变体。后续步骤在新的 repo 中。
  2. 将master分支到一个分支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. 将 origin 远程设置为公共 repo url,分支到master. 推到原点。

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

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

4

2 回答 2

2

唯一的问题是我希望能够从私人回购中提取,然后他们将拥有未共享的历史记录。

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

我不会从新的公共 repo 中提取,而是简单地考虑对新 repo 克隆所做的更改,并决定我想将哪一个添加到旧私有 repo 的本地克隆中:

# 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 .

您将看到新旧之间的差异,来自公共回购上可能进行的新演变。

于 2018-10-25T04:54:34.077 回答
2

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

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

现在只在公共存储库中创建新功能,并根据需要将它们拉回私有存储库。

于 2018-10-25T05:28:09.420 回答