GitHubでコミットを描く

[金曜日]







Githubでのユーザープロファイルアクティビティのスケジュールを常に作成したかったのです。 たとえば、52×7平方ピクセル(年52週×年7日)のサイズ制限があるにもかかわらず、1年でこのグラフが何らかの画像になるように、毎日コミットをレイアウトします。







問題は、プロセスを完全に自動化しても、それでも1年待つことでした。 そして、Githubのドキュメントを読んで、タスクが一度に簡単に、そしてさらに解決されることに気付きました。 したがって、遅滞なくそれを行う必要があります。 通常、プロジェクトの名前を思い付くのは難しいですが、ここではそれだけで生まれました。 カイは氷でペイントされ、 ゲルダはコミットで描画します!







Githubは絵としてスケジュールをコミットします







仕組み



クライアントが提供するコミットのローカル日付を考慮に入れて、アクティビティスケジュールを作成するときに既存の(意図的?)Githubの動作を使用します。 このトピックの詳細については、 サービスのヘルプをご覧ください。







また、Githubはコミットで指定されたローカル日付を信頼するため、任意の日付で任意の数のコミットを送信できます。







echo "   ,   +3!" >> gerda.md git add gerda.md git commit -m "   " --date="0001-01-01T00:00:00+0300"
      
      





したがって、私たちのタスクは、正しい日付でコミットを作成するプロセスを自動化することです。 簡単に言えば、必要なコミットを作成するスクリプトを生成するスクリプトを作成する必要があります。 途中で、プロファイルチャートでは週の最初の日が月曜日ではなく日曜日であることを忘れないでください。







スクリプトには、文字列の配列や一般的な実際の画像ファイルなど、多少なりとも人間が読める形式で画像をフィードするのが最適です。 解析を簡単にするために、行を作成しました。 Githubでは、5つの異なる色の濃淡がグラフに表示され、濃いほど、特定の日のユーザーのアクティビティが大きくなります。 例として3つ挙げます。









たとえば、「HELLO」という単語を作成します(「スムーズ」なトランジションのアンチエイリアスとしてアスタリスクを使用します)。







 $commits = [ /* columns ' 10→| 20→| 30→| 40→| 50→| ' ← exactly 52 characters */ ' ####### #####* # # ##### ###### ####### ', // Sun ' # # # # # ## # # # # ', // Mon ' # # # # # # # # * # # ', // Tue ' # # #####* # # # ##### ##### # ', // Wed ' # # # # # # # # # # ', // Thu ' # # # ## # # # # # ', // Fri ' # # # # # #####* ###### # ', // Sat ];
      
      





現在のアクティビティによる干渉が少なくなるように、左右に数週間(スペース)残しておくことをお勧めします。







今最も難しいのは、この配列を解析して、その中の各文字を特定の日と関連付けることです。 次のようになりました。







 /** *   . * * @param string[] $map       7   52   * @param \DateTime $firstSunday      * @return array */ function generateCommits($map, $firstSunday) { $commits = []; $count = 7 * 52; $date = clone $firstSunday; //      ,      for ($day = 0, $weekDay = 0; $day < $count; $day++) { $week = intval($day / 7); $char = substr($map[$weekDay], $week, 1); if ($char !== ' ') { $commits[$date->format('Ym-d')] = $char === '#' ? 20 : 10; } //     $date->add(new DateInterval('P1D')); $weekDay = ($weekDay + 1) % 7; } return $commits; }
      
      





結果として、キーは曜日であり、値はその日に必要なコミットの数である連想配列(辞書)を取得します。







 $commits = [ // ... '2016-01-31' => 10, '2016-02-01' => 20, '2016-02-02' => 20, '2016-02-03' => 10, // ... ]
      
      





その後、すべてが非常に簡単です。この辞書を調べて、結果のシェルスクリプトに必要な数の毎日のコミットを書き込みます(タイムゾーンにはモスクワの時間を使用しました)。 実験ファイルとして、マークダウンドキュメントを使用します。そのテキストには、コミットごとに1日またはその他の情報を追加します(その日のコミット数を示す箇条書きリストがあります)。







 git init echo "# Gerda" > gerda.md echo "\n## 2016-01-31" >> gerda.md echo "* Gerda №1" >> gerda.md git add gerda.md git commit -m "Gerda №1" --date="2016-01-31T12:00:00+0300" # ...  10  ... echo "\n## 2016-02-01" >> gerda.md echo "* Gerda №1" >> gerda.md git add gerda.md git commit -m "Gerda №1" --date="2016-02-01T12:00:00+0300" # ...  20  ... echo "\n## 2016-02-02" >> gerda.md echo "* Gerda №1" >> gerda.md git add gerda.md git commit -m "Gerda №1" --date="2016-02-02T12:00:00+0300" # ...  20  ... echo "\n## 2016-02-03" >> gerda.md echo "* Gerda №1" >> gerda.md git add gerda.md git commit -m "Gerda №1" --date="2016-02-03T12:00:00+0300" # ...  10  ...
      
      





プログラミングロジックが完了しました。 必要なすべての設定を1つのsettings.php



ファイルに入れて、データをロジックから分離します。







 // Streak graph picture $commits = [ ... ]; // Repository origin $origin = 'https://github.com/maximal/gerda.git'; // Output shell file $commandFile = 'repo' . DIRECTORY_SEPARATOR . 'make-commits.sh';
      
      





もちろん、Githubがどのユーザーからコミットが行われたかを理解するには、ログインとメールボックスがGita設定にある必要があります。







 # ~/.gitconfig [user] name = my_github_username email = my_github_email@ya.ru ### ...
      
      





必要な活動スケジュールを考えます。 設定に目的の画像を書き込みます。 起こったことを実行する:







検証







ああ、金曜日は52文字の制限のために喜びから飛び出しました。 正解:







コミットを使用してスクリプトを生成する







コミット付きのスクリプトが作成されました。実行します:







 cd repo ./make-commits.sh
      
      





スクリプトの最後に(原則として、数千のコミットがあります。1分待つ必要があります)、Githubはパスワードを要求します。 他の人の(そして時にはあなた自身の)スクリプトにパスワードを入力するのはクールではないので、必要に応じてこのステップでスクリプトを終了し、それを自分で実行できます(生成されたスクリプトでは、正直、正直、 git push



コマンドのみ):







 git remote add origin https://github.com/<MY>/<REPO>.git git push -u origin master -f
      
      





数分待っています(このデータがGithubによってキャッシュされていると仮定するのは合理的です)。プロファイルページを更新しています。







できた







参照資料



すべてのソースコードとその説明は(サプライズ!)Githubにあります: https : //github.com/sijeko/gerda

プルクエストがあります-光に行きます。







私のプロフィールの例の活動のライブ写真: https : //github.com/maximal







短所



プログラムがどのように知らないのか、改善できるもの:










All Articles