Remove Metadata in Git history

0x01

众所周知的可能泄露个人信息的元数据是图片中的 EXIF (Exchangeable image file format),包括相机型号,拍摄日期,焦距等技术信息。即使使用智能手机拍摄,也可能包括拍摄设备,拍摄地点,不少相机应用这些选项是默认开启。Telegram 和 Signal 会自动从待上传的图片中移除所有 EXIF,其他情况下你可以使用自由开源的安卓应用程式 Scrambled Exif (f-droid.org) 在发送之前手动移除它们。

对于职业和 amateur coder (APNews ),使用 Git (Software) 十分常见。作为版本控制软件,其会记录历史变更的时间,作者邮件地址等。

Git history 记录了备份被审查机器删除文章的项目端点星的志愿者的一些真实身份信息,共产党当局由此找到了他们,非法拘禁数月,随后安排了表演式起诉。

蔡伟,湖北人,1993年生,原在北京某互联网公司工作,2015年本科毕业于中央财经大学,2018年硕士毕业于清华大学社会学系。
大学期间,蔡伟参与过大学生通识教育夏令营(即立人大学),也在一些青少年教育活动中做义工。

可能由于事件引发的寒蝉效应 (Chilling effort),一个寻求匿名的开发者不敢用 Git 了。


AntiZhaPian, 存储库和 souce.zip 中均不包含 .git 资料夹

0x02

此段列出了 Git 历史中的一些元数据以及如何匿名化它们。

Name

name 指 gitconfig 中的 name 设置,请不要使用个人的真实姓名。

https://telegra.ph/file/865d695fd31c66bb64b03.png
匿名 commit 的教科书式配置

Timezone

您可以用 git log 查看 GIT_AUTHOR_DATE, 使用 git log --format=fuller 查看 GIT_COMMITTER_DATE。这些日期并不会根据系统当地时间转换,而是记录了作者的时区。

See this thread for rewriting timezones in commits: https://stackoverflow.com/a/60873857/461597

the following script may be useful.

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python3
def handle(commit):
"Reset the timezone of all commits."
date_str = commit.author_date.decode('utf8')
[seconds, timezone] = date_str.split()
new_date = f"{seconds} +0000"
commit.author_date = new_date.encode('utf8')
commit.committer_date = new_date.encode('utf8')

handle(commit)

要在每次 commit 时都使用 UTC, 请根据您的 shell 设置相应 alias。

注意: git commit--date 参数只能设定 GIT_AUTHOR_DATE 变量,请直接使用 env 手动设定这两个变量。

以下是 fishshell 的示例。

1
2
3
4
5
function git
set git_dic (which git)
env GIT_COMMITTER_DATE=(date -u +%Y-%m-%dT%H:%M:%S%z) GIT_AUTHOR_DATE=(date -u +%Y-%m-%dT%H:%M:%S%z) $git_dic $argv
end

Email

请避免使用 QQ 邮箱, 校友邮箱。
邮箱地址不应该包含可识别信息。

bad practice: https://github.com/lifegpc, 其 gpg public key 中的 Gmail 地址包含本人的 qq 号码。

您可以参考这个线程重写历史中的 email: https://stackoverflow.com/questions/2919878/git-rewrite-previous-commit-usernames-and-emails