
はじめに
開発に集中するあまりgit pushを忘れ、そういう時に限って事故がありデータを飛ばしてしまったので、gitコマンドを自動実行するスクリプトを作成してみました。
目的/対象
Windowsユーザー、ローカル作業&GitHub活用者、定期バックアップを自動化したい人向けのTipsになります。
更新があったときだけ、Gitの add → commit → push を自動で実行する。
変更があるかを確認するコマンド
git status --porcelain
このコマンドの出力が空でなければ「変更あり」という判断ができます。
簡易スクリプト
# git-auto-push.ps1
# 作業ディレクトリへ移動
Set-Location "C:\Users\(user-name)\(リポジトリ名)"
# 変更があるか確認
$changes = git status --porcelain
if ($changes) {
git add .
$now = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
git commit -m "Auto commit at $now"
git push origin main
Write-Output "Pushed at $now"
} else {
Write-Output "No changes to push"
}
実行コマンド
powershell -ExecutionPolicy Bypass -File "C:\Users\(user-name)\(リポジトリ名)\git-auto-push.ps1"
ログを出力できるように改良
# Start log output
$logDir = "$PSScriptRoot\logs"
if (!(Test-Path -Path $logDir)) {
New-Item -ItemType Directory -Path $logDir | Out-Null
}
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$logFile = "$logDir\git-auto-push-$timestamp.log"
Start-Transcript -Path $logFile
# Script start log
Write-Host "=== git-auto-push START ==="
# Check git status
$gitStatus = git status --porcelain
if ($gitStatus) {
Write-Host "Changes detected. Committing..."
git add .
$commitMessage = "Auto commit: $(Get-Date -Format "yyyy-MM-dd HH:mm:ss")"
git commit -m $commitMessage
git push origin main
Write-Host "Commit and push completed."
} else {
Write-Host "No changes detected. Skipping commit."
}
# End log output
Write-Host "=== git-auto-push END ==="
Stop-Transcript
機能概要
- git status で変更があるときのみ add → commit → push
- 無駄なpushを避けることでGitHubの履歴が綺麗に保てる
- .\logs ディレクトリに日付付きログファイルを自動作成
- 日付+時刻付きログファイルが作成
- ログは Start-Transcript / Stop-Transcript を使って出力されます
- タスクスケジューラで1時間ごとにチェックもOK(必要なら停止も容易)
文字化けする場合
文字化けの原因は、PowerShell の出力とログ保存時の文字エンコーディング(Shift_JIS) によるものです。
PowerShell はデフォルトで Write-Host などの出力を Shift_JIS で扱うため、UTF-8(BOMなし)で保存したスクリプトでもログ出力先では文字化けが発生します。
解決方法
① コミットメッセージを明示的に UTF-8 で渡す
$commitMessage = [System.Text.Encoding]::UTF8.GetString(
[System.Text.Encoding]::UTF8.GetBytes("自動コミット: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')")
)
git commit -m $commitMessage
これで Git に渡すメッセージが UTF-8 として処理され、GitHub 上でも文字化けせず表示されるはずです。
② Start-Transcript をやめて Out-File -Encoding utf8 に切り替える
Start-Transcript は Shift_JIS 固定で書き出されることが多いため、以下のように変更すると UTF-8 のログ出力が可能です
タスクスケジューラーでの登録手順
Windows標準の タスクスケジューラ を使うと、Linuxのcrontabに相当する事を実行可能です。

1. 基本タスクの作成
右側メニューから「基本タスクの作成…」をクリック

2. 名前と説明を入力
例: 名前:Git Auto Push 説明:Gitの変更を検出して自動でコミット&プッシュするPowerShellスクリプト

3. トリガーを選択
例:毎日 or ログオン時 or PC起動時 など。
開発中なら「毎日」でテストするのが無難です。


4. 操作を「プログラムの開始」に設定
プログラム/スクリプト:
powershell.exe
引数の追加(オプション):
-ExecutionPolicy Bypass -File "C:\Users\(user-name)\(リポジトリ名))\git-auto-push.ps1"


5. 確認完了

6. 補足(うまく動かない場合)
- 実行ユーザーの権限を確認(管理者実行が必要な場合も)
- スクリプトがUTF-8(BOMなし)で保存されていること
- 実行ログで失敗が続くようなら「タスクのプロパティ」で詳細設定(例:最上位の特権で実行など)
7.登録済みタスクの確認
-
タスクスケジューラを開く
-
左側のパネルから 「タスク スケジューラ ライブラリ」 をクリック ※ローカルのすぐ下にあります
-
中央のペインに、登録されているタスク一覧が表示されます ここに先ほど作成した「Git Auto Push」などの名前が表示されているはずです。

📌 ヒント
- タスク名をダブルクリックすると詳細設定が確認・編集できます(「トリガー」「操作」「条件」「履歴」など)。
- 「操作」タブでスクリプトのパスが正しいかなども再確認できます。
- タスクの右クリックで「実行」「無効」「削除」なども可能です。
もし見つからない場合は:
- 左側パネルで「タスク スケジューラ ライブラリ」以下のフォルダを展開し、別フォルダに入っていないか確認してください(まれに「Microsoft」などのサブカテゴリに入ってることも)。
- 「最新の情報に更新」(右パネル)をクリックしてみてください。
💬 コメント