nekoTheShadow’s diary

技術ブログとして始めたはずが、読書&愚痴ブログになりました(´・ω・`)

GitHubに草を生やしまくるスクリプト

現在絶賛転職活動中で、SIerからWeb系への転向も視野に入れているのですが、Web系ではGitHubの内容、なかでも通称"草"と呼ばれるcontribution履歴が重視されるようです。ということは--スクリプトなどでGitHubに草を生やしまくれば、あたかもスーパーハッカーであるかのように偽装でき、いろいろな企業から引く手あまたなのでは??? (← そんなことはありません)

というわけで「GitHubに草をはやしまくるシェルスクリプト」を書いてみました。要件としては以下の通りです。

  • 実行するとfake-projectというプロジェクトが作成され、2017-01-01から2018-12-31までの2年間、そのプロジェクトに毎日コミットしたかのように見せかける。
  • コミット回数は1日1回から5回まで。ただし単純なランダムではなく、コミット回数が多い日ほど少なく、逆にコミット回数が少ない日ほど多くする。
    • 単純な一様分布ではなく、大きい数字ほど出づらくするような傾斜をかけるイメージ
  • コミットメッセージはコミット日付をそのまま使いまわす。
    • 有名なOSSプロジェクトから拾ってきたメッセージをもとに機械学習でそれらしいメッセージを作る--というのは考えたのですが、そこまでの技術力はありませんでした(´・ω・`)

以上をみたすシェルスクリプトfake.shは以下の通りです。

#!/bin/bash

mkdir fake-project
cd fake-project
git init

start="2017-01-01"
seq 0 $(( ($(date -d "${start}+2years" +%s) - $(date -d ${start} +%s)) / (60*60*24) )) | while read day; do
  seq 1 $(seq 5 | tac | awk '{for(i=0;i<NR;i++) print $0}' | shuf | head -n 1) | while read hour; do
    timestamp="$(date -R -d ${start}+${day}days+${hour}hours)"
    date -d ${start}+${day}days+${hour}hours
    echo ${timestamp} >> fakefile
    git add -A
    git commit -m "${timestamp}"
    git commit --amend --date="${timestamp}" -m "${timestamp}"
  done
done

簡単な技術解説:

  • dateコマンドはGNU版を利用しています。
  • GitHubの草はGitのAuthor Dateを見ているようなので、git commit --amend --date=timestampで直前のコミットを偽装しています。
  • 傾斜のかかった乱数ですが、まず注目すべきはseq 5 | tac | awk '{for(i=0;i<NR;i++) print $0}'。この一連のコマンドは1を5個、2を4個、… 5を1個、それぞれ標準出力に出力します。あとはこの出力をshufでシャッフルしているわけですね。

さてfake.shを実行後(完了までは数分かかります)、カレントディレクトリに作成されたfake-projectGitHub上に作成したレポジトリにpushすると、偽装は完了。偽装前の2017年と2018年の"草"の状態は以下のようにたいへんみすぼらしいものでした。

f:id:nekoTheShadow:20180920232842p:plain f:id:nekoTheShadow:20180920232811p:plain

それがなんということでしょう! fake.shにより作成したプロジェクトをGitHubにpushするだけで、あっというまにスーパーハッカー風の草原ができあがったではありませんか!!! これで君もスーパーハッカ―だ!!! (← 違います)

f:id:nekoTheShadow:20180920233138p:plain f:id:nekoTheShadow:20180920233140p:plain


作成したプロジェクト、ならびにfake.shは以下のリンクに設置しています。御笑覧ください(´・ω・`)

github.com