PowerShellを使って、Windows環境でGitの変更を自動的にコミット&プッシュする方法を解説します。変更があった時のみ実行される仕組みや、ログ出力機能付きのスクリプトで、安全かつ効率的な自動化を実現します。日々のバックアップや開発作業の効率化に役立つ実用的Tipsです。

はじめに

開発に集中するあまり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に相当する事を実行可能です。

 【タスクスケジューラ】を使う(crontab 相当)

1. 基本タスクの作成

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

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

2. 名前と説明を入力

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

 右名前と説明を入力

3. トリガーを選択

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

 トリガーを選択  毎日 or ログオン時 or PC起動時 など

4. 操作を「プログラムの開始」に設定

プログラム/スクリプト:

powershell.exe

引数の追加(オプション):

-ExecutionPolicy Bypass -File "C:\Users\(user-name)\(リポジトリ名))\git-auto-push.ps1"
プログラムを開始 プログラム/スクリプト、引数の追加(オプション)

5. 確認完了

確認・完了

6. 補足(うまく動かない場合)

  • 実行ユーザーの権限を確認(管理者実行が必要な場合も)
  • スクリプトがUTF-8(BOMなし)で保存されていること
  • 実行ログで失敗が続くようなら「タスクのプロパティ」で詳細設定(例:最上位の特権で実行など)

7.登録済みタスクの確認

  1. タスクスケジューラを開く

  2. 左側のパネルから  「タスク スケジューラ ライブラリ」 をクリック  ※ローカルのすぐ下にあります

  3. 中央のペインに、登録されているタスク一覧が表示されます  ここに先ほど作成した「Git Auto Push」などの名前が表示されているはずです。

登録済みタスクの確認

📌 ヒント

  • タスク名をダブルクリックすると詳細設定が確認・編集できます(「トリガー」「操作」「条件」「履歴」など)。
  • 「操作」タブでスクリプトのパスが正しいかなども再確認できます。
  • タスクの右クリックで「実行」「無効」「削除」なども可能です。

もし見つからない場合は:

  • 左側パネルで「タスク スケジューラ ライブラリ」以下のフォルダを展開し、別フォルダに入っていないか確認してください(まれに「Microsoft」などのサブカテゴリに入ってることも)。
  • 「最新の情報に更新」(右パネル)をクリックしてみてください。