# GitHub ActionsによるSpacesの管理

公式の[`huggingface/hub-sync`](https://github.com/marketplace/actions/sync-github-to-hugging-face-hub)GitHub Action を使用して、Space を GitHub リポジトリと同期させることができます。

`hub-sync` は、Models および Datasets にも対応しています。一般的な使用方法については、[GitHub Actions](./repositories-github-actions) を参照してください。

## セットアップ

1. Hugging Faceの[アクセストークン](https://huggingface.co/settings/tokens)を値とする`HF_TOKEN`という名前の[GitHubシークレット](https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-an-environment)を作成します。
2. リポジトリにワークフローファイル（例: `.github/workflows/sync-to-hub.yml`）を追加します:

```yaml
name: Sync to Hugging Face Hub
on:
  push:
    branches: [main]

jobs:
  sync:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: huggingface/hub-sync@v0.3.0
        with:
          github_repo_id: ${{ github.repository }}
          huggingface_repo_id: username/my-space
          hf_token: ${{ secrets.HF_TOKEN }}
```

Space SDKは`space_sdk`（デフォルトは`gradio`）で設定できます。[すべてのパラメータ](./repositories-github-actions#parameters)を参照してください。

## 仕組み

このアクションは、`hf` CLI（`hf repos create` + `hf upload`）を使用してファイルを Hub にミラーリングします。これは git 間の同期ではなく、ファイルの内容をアップロードし、`.github/` ディレクトリと `.git/` ディレクトリを自動的に除外します。GitHub リポジトリから削除されたファイルも、Hub から削除されます。

より複雑なワークフロー（ビルドステップやカスタムロジックなど）では、代わりにワークフロー内で直接[`hf` CLI](https://huggingface.co/docs/huggingface_hub/en/guides/cli)をインストールして使用できます。

## ファイルサイズの考慮事項

このアクションは`hf upload`を使用してファイルの内容をアップロードするため、HubのためにGit LFSやgit-xetを設定する必要はありません。大きなファイルは自動的にXetに保存されます。GitHubリポジトリでGit LFSを使用してファイルを保存している場合（GitHubでは100MBを超えるファイルに必要です）、`actions/checkout`ステップで`lfs: true`を設定してください。これにより、アクションがLFSポインターではなくファイル自体をアップロードします。

## 代替案: 手動でのgit push

ファイルミラーリングではなく、git-to-git の直接同期を希望する場合は、Space の git リモートに直接 push できます。git push を使用する場合、10MB を超えるファイルは [git-xet](./xet/using-xet-storage#git-xet)（推奨）または Git LFS でトラッキングする必要があります。

```yaml
name: Sync to Hugging Face hub
on:
  push:
    branches: [main]
  workflow_dispatch:

jobs:
  sync-to-hub:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
          lfs: true
      - name: Push to hub
        env:
          HF_TOKEN: ${{ secrets.HF_TOKEN }}
        run: git push https://HF_USERNAME:$HF_TOKEN@huggingface.co/spaces/HF_USERNAME/SPACE_NAME main
```

`HF_USERNAME` をユーザー名に、`SPACE_NAME` を Space の名前に置き換えてください。

