We recently had another team rewrite their service in Rust, with a massive boost in performance. So naturally, for April Fools’ I made a big announcement that our team followed suit:
But, at good prank isn’t just “I thought this was true, but it wasn’t”. It’s “I though it was a joke, but for a brief moment doubted that”. The “Oh, no, he didn’t"-moment.
Alas, one more line was necessary:
The proof. With a link. A Call-To-Action. Click it! Marvel at it!
Creating fake commits
Creating a GitHub repo that looks like Rust isn’t hard. You can look at a few open-source projects and copy what you need (respecting the license, of course).
That gives you the language-overview:
And a proper
Cargo.toml, prominently featuring dependencies that seem to make sense:
I committed using the
$ git commit -a -m "Initial template & infra for booking3" \ --date="7 days ago at 08:46"
and checked the log:
$ git log commit 983e4977983ee134771885f6c08881513c4faef1 (HEAD -> main) Author: Jannik Arndt <email@example.com> Date: Mon Mar 22 08:46:00 2021 +0100 Initial template & infra for booking3
Looks good. For a preview, I created a repo in my personal account and pushed it:
$ git remote add origin https://github.com/JannikArndt/booking3.git $ git push --set-upstream origin main
TWO MINUTES AGO? How could that be?!
git has different formats for the log:
raw. The default is
fuller format shows the whole truth:
$ git log --pretty=fuller commit 983e4977983ee134771885f6c08881513c4faef1 (HEAD -> main, origin/main) Author: Jannik Arndt <firstname.lastname@example.org> AuthorDate: Mon Mar 22 08:46:00 2021 +0100 Commit: Jannik Arndt <email@example.com> CommitDate: Tue Mar 30 22:47:39 2021 +0200 Initial template & infra for booking3
AuthorDate and a
Okay, let’s try again.
Faking AuthorDate and CommitDate
A quick googling later I arrived at
$ GIT_COMMITTER_DATE="2021-03-20T11:43:11" \ git commit -a -m "Initial template & infra for booking3" \ --date="2021-03-20T11:43:11"
Faking the Author — and Committer
Next I needed commits from the whole team to make this look realistic. Following the
$ GIT_COMMITTER_DATE="2021-03-23T11:43:11" \ GIT_COMMITTER_NAME="Cristina" \ GIT_COMMITTER_EMAIL="firstname.lastname@example.org" \ git commit -a -m "Change deployment to booking3" --date="2021-03-23T11:43:11"
Of course not.
GitHub does make a difference between the author and the committer. So to fully fake someone else’s commit:
$ GIT_COMMITTER_DATE="2021-03-23T11:43:11" \ GIT_COMMITTER_NAME="Cristina" \ GIT_COMMITTER_EMAIL="email@example.com" \ git commit -a -m "Change deployment to booking3" --date="2021-03-23T11:43:11" \ --author="Cristina <firstname.lastname@example.org>"
It worked 😎
Since I had a few commits left to do and I don’t enjoy typing, I refactored my command a little:
$ DATE="2021-03-23T11:43:11"; \ NAME="Cristina"; \ MAILemail@example.com; \ GIT_COMMITTER_DATE=$DATE GIT_COMMITTER_NAME=$NAME GIT_COMMITTER_EMAIL=$MAIL \ git commit --author="$NAME <$MAIL>" --date=$DATE -m "<the message>"
I also tried
--allow-empty, and while the messages appear in the history, they don’t change the appearance on the first view, since they don’t touch any files. Obviously.
I also tried to balance the amount of lines to generate a more realistic “Pulse” in the “Insights” section:
(I still remembered from when I found the other teams Rust-repo that I looked at this to find out who was leading this effort.)
Next I needed the green little checkmark to fabricate a successful CI/CD:
It hurts a little to spin up a fresh Ubuntu just for a green checkmark, but I didn’t find a quicker way:
name: deployment on: push: branches: [main] jobs: test: runs-on: ubuntu-20.04 steps: - run: echo "April Fools!"
I also thought about creating and merging PRs, but those are way harder to forcibly overwrite (and I don’t know the GitHub API well enough to automate that on the spot).
After about two hours of hacking, I was satisfied.
The reactions were rewarding: People dug into the code, found, commented on and appreciated all the details and even opened new Pull-Requests.
However, one thing nobody noticed…
After figuring out how, creating fake commits for my co-workers turned out surprisingly easy. Or for anyone else, for that matter:
That’s not great. What you can do about it is verified commits. Since we use the “Squash and merge” button, all commits on master are done through the GitHub UI and therefore verified by our logins:
To also have this for commits you create locally, you can sign commits via GPG
$ git config --global commit.gpgsign true