搭建个人博客中遇到的问题及解决

删除已上传GitHub文件中含有的敏感数据

Posted by UlyC on March 8, 2018

正所谓前人栽树,后人乘凉。

感谢柏荧(BY)提供的教程

我的博客

一、GitHub Desktop相关问题

管理文件windows与mac不同

问题描述

在教程中作者用的是Mac版,如图:

而Windows版本的GitHub Desktop是没有“Open In Finder”(在文件夹中打开)这一选项的。 又由于不熟悉macOS系统, 导致我以为这是GitHub Desktop的用户界面。 无论如何我在windows版GitHub Desktop中都找不出显示文件结构的界面。

问题解决

直接在文件夹中打开仓库目录即可。 可以看到文件结构跟GitHub上一模一样了,此后这个仓库的操作都是在文件夹中直接进行的。


备注:

修改过本地文件后,你想要将他们同步到你GitHub的仓库中。

左边“Changes”会显示你最近做过的修改,你要在左下角箭头处填上此次修改的名称(最好是有意义的描述,方便以后查询),然后“Commit Changes”。
而你直接在网页GitHub中修改文件时,不用添加标题,系统会为你自动填写“Commits on XX,XX,XX(具体时间)”。

注意,你“Commit”之后并没有和GitHub同步起来,你仍需点击右上角“Pull Origin”才会同步。在Mac版中“同步”按钮长这样

删除已上传GitHub文件中含有的敏感数据

问题描述

在熟悉使用GitHub时看到每次修改都会留下具体记录,就想到如果有人不小心上传了含有密码等敏感信息要怎么删除呢。

问题解决

方案一:直接在GitHub中操作

要知道GitHub并不像你用的新浪博客或者QQ空间一类的网站,你直接在源码中删除修改提交是会留下记录而且任何人都可以查阅的,并且修改的部分还会高亮显示。
在GitHub中可以直接删除整个仓库,这样别人就不会看到你的信息修改记录,当然这个方案太暴力且不优雅,不推荐。

方案二:在GitHub Desktop中操作

在这里我们先明确几个概念:Git、GitHub和GitHub Desktop的关系。

  1. git:一款免费、开源的分布式版本控制系统,是一款软件,与之相对的还有集中式的版本控制系统,比如Svn等。
  2. GitHub:github是一个基于git的项目托管平台 , 它提供了web界面,你可以在上面创建资源仓库来存放你的项目。
  3. ** GitHub Desktop:直接使用Git是没有GUI(图形用户界面)的,GitHub Desktop相当于一个用来管理GitHub的 **简易版本的 具有GUI的Git 软件。所以功能很少也就不奇怪了。

使用GitHub Desktop能做的也只是直接删除仓库。

方案三:使用Git

关于使用Git的教程有很多,推荐这篇教程“龙恩0707的Git使用教程”
(使用Git过程中我遇到的问题会在后面提到)

学会Git的基本操作之后,使用git filter-branch命令进行操作。
具体命令需要参照Git官方文档Git的官方文档,下面我给出的是简易版本的操作。

1. 利用Git clone一份仓库到本地(上面链接教程中有)
2. 在Git中进入项目工程目录
3. 执行以下命令
git filter-branch --force --index-filter \ git rm --cached --ignore-unmatch  SSfiles.py


其中的“SSfiles.py”就是你要删除的含有敏感信息的文件名称。

4.切到每个分支和tag,确保都已经成功清除要删的文件
5.强制把本地的更改push到GitHub上

输入git push origin --force --all即可。

可以看出 git filter-branch命令确实比较复杂,在所有搜到的删除敏感信息教程中都不太推荐使用这个命令,但是这个高级命令功能其实十分强大,建议有兴趣的可以根据官方文档深入学习一下。

此方法只是简单粗暴的将含有敏感信息的整个文件进行删除,其实通过 git filter-branch命令也可以单独修改特定文件特定内容,但过程实在繁杂,在此不再赘述。

方案四:使用BFG Repo-Cleaner

BFG Repo-CleanerBFG Repo-Cleaner这款工具是专门针对移除历史记录的需求而产生的(BFG 即是git filter-branch 首字母的逆转),也是GitHub官方推荐使用的工具,操作简便,运行快捷。
下面来说具体的操作:

1.下载 BFG

[BFG Repo-Cleaner](https://rtyley.github.io/bfg-repo-cleaner/#download)

2.下载Java,配置Java环境变量

因为BFG 下载下来是一个.jar文件,所以使用它需要 Java 的运行环境,具体配置方法请自行搜索。

3.克隆你的仓库到本地

注意这里克隆使用的命令是镜像模式克隆git clone --mirror,镜像模式克隆的仓库和远程仓库完全一样,但是不能直接看到仓库里面的文件,而且也不能允许 git 的各种命令。

我开始直接使用git clone克隆的仓库,在最后提交时总是出现错误,还是按照官方文档的git clone --mirror命令才pull成功。

4.运行BFG

此条为什么要单独拉出来说呢,因为起初我以为是直接双击下载下来的.jar文件运行,但是无论如何都是闪下命令框就秒退。

这是因为java文件运行时如果不需要用户输入数据操作,那么就会出现上述情况。而且BFG也是没有GUI的,故要在CMD或者在git里运行使用相关命令。 还需要注意的两点是

  1. BFG文件路径中不可以有中文,不然会一直报错
  2. BFG放在库的目录下运行,省得运行时再输入文件路径。
5.删除含敏感信息的文件

在Git的仓库目录下通过命令 java -jar bfg.jar --delete-files SSfiles.py test.git 删除库“test.git”中含有敏感信息的文件“SSfiles.py”。

5.1 只单独删除特定文件中特定内容

创建一个名为replacements.txt的文件跟bfg文件放在一个目录下,在其中一行一个输入你的敏感信息,比如说密码,邮箱等。
输入命令 java -jar bfg.jar --replace-text replacements.txt test.git 你所有记录以及文件中的信息都会被替换成“* REMOVED*”。

5.2 替换特定文件中特定内容

只需要把你的replacements.txt文件中输入所有需要替换的内容,格式如下(不包含注释内容):

6. 强制push

处理完成后,输入git push命令完成推送。
push过程中我出现以下错误:

    1. fatal: remote error: You can't push to git

这个是因为我从远程仓库克隆时使用的命令是git clone git://github.com/user/test.git;
git clone git://github.com/user/test.git这样的url请求是只读的,像HTTPS URL比如: https://github.com/user/test.git才是可写的。

使用 git remote set-url origin 命令修改远程URL即可解决。

    1. error: failed to push some refs to '

出现此错误是因为当初克隆远程仓库到本地时,使用的是git clone命令,删除后换用git clone --mirror重新克隆就可以了。

部分参考链接:

  1. 柏荧:快速搭建个人博客
  2. 你的 Github 仓库被 DMCA Takedown 后怎么办?
  3. 土豆不好吃:不小心把密码上传到 GitHub 了,怎么办
  4. 彻底删除git仓库中的包含敏感信息的文件
  5. 【GIT技巧】清除历史提交记录中的敏感信息

知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。