GitHubに毎日自動で草を生やそう (Windows)

#草、生えてると嬉しい
新緑の季節なのでGitHubにも草を生やしましょう。草とはこれのこと
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/8e89fb41-53aa-a0d2-64b6-93b0dfb81b6e.png" width=100%>
参考
GitHub 芝生入門/芝生応用
https://qiita.com/sta/items/2c1f0252a6a9ce5e2087

>ここは毎日熱心に活動しているとキレイな緑色が並びます。その見た目が芝生みたいにカラフルだからか、日本では 芝生 と呼びます（正確な起源や由来はわかりません）。

>この芝生に緑色を増やすには、Contribution（GitHub上での活動のうち芝生に反映される活動）を行う必要があります。この行為を 草を生やす といいます。

#自動化しようと思った経緯
Atcoderの問題を解くのにAtCoder Problemsを利用しているのですが、これのHeatmapと同じことをGitHubにも反映させたいと思ったからです。毎日問題解けばAcoder Problemsだけでなく、GitHubにも草を生やせます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/747fbec4-4fcf-854c-5f75-916eec275638.png" width=100%>
AtCoder Problems - kenkoooo.com
https://kenkoooo.com/atcoder
User ID入力 → UserPage → Progress Charts → Heatmap
で確認できます。

#流れ
・ローカルに自動アップロードしたいファイルを作ります(abc167a.py等、問題の解答のソースコードを作ります)。
以下の操作コマンドを.batファイルに書き込み、Windowsのアプリケーションのタスクスケジューラで毎日定期実行します。
・GitHub上のリモートリポジトリをローカルに複製します。
・リポジトリ内のファイルと比べて最新の状態が更新されていたらそのファイルを更新します。
・GitHubへローカルからリモートリポジトリに自動でアップロードします。

#やること
GitHubのアカウントを作成済み、gitはWindowsにインストールされている前提とします。
GitHubにリポジトリを作ります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/a8ddde43-a68a-ff79-f310-8cdeefa01515.png" width=100%>

自動アップロードしたいファイルが`C:\Users\[PC_name]\desktop\at\abc167a.py`にあるとします。

ローカルのgithubフォルダの下にGitHubリポジトリと同じ名前のフォルダを作ります。今回のフォルダ名は"atcoder"としています。
`C:\Users\[PC_name]\github\atcoder`

さらにその下に"atcoder"フォルダを作ります。
`C:\Users\[PC_name]\github\atcoder\atcoder`

GitHubに自動アップロードしたいフォルダと同じディレクトリに"auto_git.bat"を作ります。
デスクトップ上の"at"フォルダ内のすべてのファイルをアップロードしたいので、
`C:\Users\[PC_name]\desktop\at\auto_git.bat`
とします。

```auto_git.bat
cd C:\Users\[PC_name]\github\atcoder
git init
git config --global user.name "[Your_name]"
git config --global user.email "[Your_address@mail]"
git clone https://github.com/[github_ID]/atcoder C:\Users\[PC_name]\github\atcoder\atcoder
xcopy /d C:\Users\[PC_name]\desktop\at C:\Users\[PC_name]\github\atcoder\atcoder
cd atcoder
git add --all
git commit -m "auto commit"
git push -f
exit

```
`[PC_name]`等、適正変更が必要です。各個人の環境に合わせてください。
コマンドプロンプトを開いた時のデフォルトの場所が`C:\Users\[PC_name]>`になっていることを確認してください。

#コマンドの解説
`C:\Users\[PC_name]\github\atcoder`に移動します。

```.bat
cd C:\Users\[PC_name]\github\atcoder
```
Gitのリポジトリを作成します。

```.bat
git init
```
ユーザー名とメールアドレスを設定します。

```.bat
git config --global user.name "[Your_name]"
git config --global user.email "[Your_address@mail]"
```
GitHubのリモート上にあるリポジトリのコピーをローカル上に複製します。

```.bat
git clone https://github.com/[github_ID]/atcoder C:\Users\[PC_name]\github\atcoder\atcoder
```
(xcopyはWindowsのコマンドです。)
`/d`オプションをつけることで、コピー元とコピー先のファイルを比べて、新たに作成された、もしくは最新の状態が更新されたファイルのみコピーされます。

```.bat
xcopy /d C:\Users\[PC_name]\desktop\atcoder C:\Users\[PC_name]\github\atcoder\atcoder
```
```.bat
xcopy /d [コピー元] [コピー先]
```
今回の場合は

```.bat
xcopy /d [自動アップロードしたいファイルが含まれているフォルダの場所] [GitHubにアップロードするフォルダの場所]
```
とします。

`C:\Users\[PC_name]\github\atcoder\atcoder`に移動します。

```.bat
cd atcoder
```
ローカルからリモートへの変更を`add`して`commit`して`push`します。

```.bat
git add --all
git commit -m "auto commit"
git push -f
```
プログラムを終了し、コマンドプロンプトを終了します。最終行に改行が含まれていることに注意してください。

```.bat
exit

```
好みで`pause`に変更可能です。

#タスクスケジューラの設定
検索バーに「タスクスケジューラ」と入力します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/4520d368-56d1-1b7a-f8c7-e12ba8373b2f.jpeg" width=75%>

右クリックから基本タスクの作成を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/00262d54-9704-1168-cf17-44011876eac7.png" width=75%>

タスク名を入力します。今回は「auto_git」としています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/570c484b-fa03-8e54-8099-c9e634d80677.png" width=75%>

実行するタイミングを決めます。毎日実行したいので「毎日」を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/77d9bcd3-f8fb-8652-e9b0-af4d19a8e1f2.png" width=75%>

実行する時間を決めます。今回は「22:00:00」としています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/feec1759-b2ab-fa2e-66c8-1dfea6cf47c1.png" width=75%>

タスクの操作を選択します。「プログラムの開始」を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/fde73f78-22ff-300a-c670-674b0b078c85.png" width=75%>

前の項で作成した"auto_git.bat"ファイルを参照します。コピー元フォルダにある"auto_git.bat"ファイルを指定してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/b4897a63-f640-b60e-37c3-3ae7e33f03a3.jpeg" width=75%>

確認します。これでよかったら完了をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/87874ed4-9640-cbc4-b3ed-384d1022e483.jpeg" width=75%>

完了しました。右タブ内の「実行」で試しに実行してみるとよいでしょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/5eda0a90-a525-91af-419e-81419987de79.jpeg" width=75%>


#注意事項
###1.
プログラムの実行中にxcopyコマンドでファイルの更新があったときに-dオプションの特性で

```
C:\Users\ktais\github\atcoder\atcoder\.bat を上書きしますか (Yes/No/All)?
```
と聞かれるので

```
y
```
とファイルごとに入力する必要があります。自動じゃなくて半自動じゃんというツッコミには対応していません。

###2.
タスクスケジューラはPCがスリープ状態だと起動しないようです。もし、22:00:00にスリープ状態になっていて、そのあとPCを起動した際に手動でauto_git.batを実行しましょう。

###3.
半自動でアップロードされるので秘密情報が含まれていたり、膨大なサイズのファイルをコピー元のフォルダ内に作成するときは気を付けましょう。

#実行結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315028/4f1a44b7-bf89-90f3-1fa5-af1413661582.jpeg" width=100%>
自動でアップロードされています。

#まとめ
ローカルとリモートを手動で同期するという日々の無駄な作業が自動化できました。よい芝生ライフを!