Githubのレポジトリを全てPrivateにする方法


## はじめに
「**世界から見られている」というと、一見華やかでカッコいいかもしれません。  
しかし、あなたのGitHubリポジトリが「おっと、うっかり中身を公開していた…」となっていたらどうでしょう。  
そもそも間違ってAPIキー丸出しのコミットをしていたり、秘伝のソースコードを晒していたり…  
そんなときはもう、**世界に対して己の恥を晒している状態**です。

そこで本記事では、**「ちょっとヤバいかも…」と気づいたその日にPublicリポジトリを一気にPrivate化**するPythonスクリプトを紹介します。  
ちょっとスパイ映画っぽい響きですが、「**一括Private化**」の呪文をこっそり使って、安全と安心を手に入れましょう。

## 前提条件
- Python環境があること（3.x 系推奨）
- [GitHub Personal Access Token](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)を取得済みで、環境変数 `GITHUB_TOKEN` に設定しておくこと  
  例：  
  ```bash
  export GITHUB_TOKEN=ghp_XXXXXXXXXXXXXXXXXX
  ```
  ついうっかりトークンをコミットしないようご注意を！（一瞬でトークン失効するか、大惨事になる危険あり…）

## 心構え
1. **バックアップを取る**  
   万が一のため、ローカルにpullしてバックアップを取ったり、そもそもよくわからないリポジトリがあれば先に調べておくと安心です。  
2. **実行は自己責任**  
   PublicからPrivateに変えた瞬間、外部の連携サービスが動かなくなる可能性があります。たとえばGitHub Pagesが使えなくなるとか、コントリビュータの皆さんに混乱を招くとか。  
3. **うっかり実行ミスして「全消し」しないように**  
   ここでは「全部Privateにする」スクリプトを紹介していますが、**「全部削除する」**と間違えたら笑えないやらかしになってしまいます…。  
   コピペするときは慎重に！

## スクリプト全体
以下が「Publicリポジトリを探し出して、一気にPrivate化しちゃおう」というPythonスクリプトです。

```python
import requests
import os

def check_public_repos(github_token, execute_change=False):
    """
    GitHub上の自分のpublicリポジトリを確認し、オプションでprivateに変更する
    """
    api_url = "https://api.github.com"
    headers = {
        "Authorization": f"token {github_token}",
        "Accept": "application/vnd.github.v3+json"
    }
    
    # 自分のpublicリポジトリを取得
    repos_url = f"{api_url}/user/repos?visibility=public"
    response = requests.get(repos_url, headers=headers)
    
    if response.status_code != 200:
        print(f"リポジトリの取得に失敗しました。ステータスコード: {response.status_code}")
        return
    
    repos = response.json()
    
    print(f"\n=== 影響を受けるリポジトリ（合計: {len(repos)}個）===")
    for i, repo in enumerate(repos, 1):
        print(f"{i}. {repo['full_name']} (★{repo['stargazers_count']} 👁️{repo['watchers_count']})")
    
    if not execute_change:
        print("\n※これは確認モードです。実際の変更は行われません。")
        print("変更を実行する場合は、execute_change=True を設定してください。")
        return
    
    confirm = input("\n上記のリポジトリをprivateに変更します。実行しますか？(y/N): ")
    if confirm.lower() != 'y':
        print("操作をキャンセルしました")
        return
    
    print("\n=== 変更を実行中 ===")
    for repo in repos:
        repo_name = repo['full_name']
        repo_url = f"{api_url}/repos/{repo['full_name']}"
        
        update_data = {
            "private": True
        }
        
        update_response = requests.patch(repo_url, json=update_data, headers=headers)
        
        if update_response.status_code == 200:
            print(f"✓ {repo_name} をprivateに変更しました")
        else:
            print(f"× {repo_name} の変更に失敗しました。ステータスコード: {update_response.status_code}")

if __name__ == "__main__":
    github_token = os.getenv("GITHUB_TOKEN")
    
    if not github_token:
        print("環境変数 GITHUB_TOKEN が設定されていません")
        exit(1)
    
    # 実行時はFalseからTrueに変更してください
    check_public_repos(github_token, execute_change=True)
```

### 処理の流れ
1. **`GITHUB_TOKEN`を使ってGitHub APIと通信**  
2. **自分のアカウントのPublicリポジトリ一覧を取得**  
3. **リポジトリをズラッと表示**  
4. **`execute_change=False` の場合はただ確認するだけ**（いわば安全モード）  
5. **`execute_change=True` なら本当にPrivateに変更をかける**  
6. **最終確認で `y` と入力すると「オラッ！Privateにしちゃうぞ〜！」と突撃する**  

### スクリプトを使うときのちょっとしたTIPS
- **初めて実行するときは `execute_change=False` 推奨**  
  「本当に全部privateにして大丈夫だよね？」をチェックするために、まずは安全確認してください。
- **リポジトリが大量にある場合**  
  親の顔より見たPublicリポジトリがあるなら、ちょっとゆっくり時間を置いて実行しましょう。GitHub APIのレートリミット制限に引っかかるかもしれません。  
- **`input`部分をスキップしたい人向け**  
  CI/CD上でガンガン自動化したい場合は、`input`で確認を求める箇所を削除するか、あらかじめ `y` と決め打ちする形に書き換えてください。  
  ただし、**もし事故ったら泣かないように…**。

## まとめ
GitHubのPublicリポジトリは便利ですが、どこかのタイミングで「全部Non-Publicにしたい！」と思うことってありますよね。  
そんなとき、このスクリプトを使えばパッと一括変更が可能です。  
トークンの管理には十分注意しつつ、大事な秘密を世界中に晒さないためにも、**「秘伝のソースは秘伝のまま」**にしておきましょう。

最後に、実行するかどうか迷うあなたへ  
> **「指が勝手に……キーを押しちゃうんです……！」**  

という状態であれば、まずは一旦深呼吸しましょう。  
そして、本当にPublicからPrivateにして問題ないか、いまいちどリポジトリを確認してからGoです！

Happy GitHub Life!