この記事は、42Tokyo Advent Calendar 2025 の参加記事です。
42 の課題リトライ地獄から抜け出すために
42 の課題って、提出してからが本番ですよね!!!
- 機械採点ではじかれた
- Norminette で細かいところを指摘された
- Reviewer にボコボコにされた
→ 修正して再提出することなんて無限にすることやと思います。
そんなとき、こんなあるある ありませんか?
- 毎回ローカルで別ディレクトリにコピー → そこだけ修正して push しなおす
- どのディレクトリが最新かわからんくなる
- 「修正版を push したつもりが、1 個前のコミット出してた…」みたいな事故が起きる
- 結果、Commit History もディレクトリ構成も ぐちゃぐちゃ
僕も完全にこれで、提出プロジェクトが増えるたびにカオスになってました。
解決策:自分の GitHub を「真のリポジトリ」にする
そこで僕がたどり着いたのが、
自分の GitHub リポジトリを「一番信用する・ちゃんと守る」場所にする
という運用です。
具体的には、
- まず 自分の GitHub に課題用リポジトリを作る
- 普段の開発・修正・履歴は全部 自分の GitHub(origin)に push
- 課題提出のときだけ、評価用リモート(vogsphere)を「もう 1 本の remote」として追加して push
というスタイルです。
実際のコマンドイメージ
Libft の課題用リポジトリがあって、すでに自分の GitHub から clone してあるとします。
提出用に vogsphere の URL が発行されたら、そのリポジトリ内で:
git remote add vogsphere <vogsphereのURL>
と一度だけ実行しておきます。
以降の運用はこんな感じ:
-
普段の開発:
git add . git commit -m "Fix ft_split edge cases" git push origin master # or main -
提出 / リトライするとき:
git push vogsphere master # or main, 課題のルールに合わせて
これだけです。
コードの真の履歴は常に自分の GitHub(origin)に集約されているので、
- 「どのコミットを出したか」
- 「前回どこまで直していたか」
- 「昔の黒歴史コード」
まであとから追いやすいです。
vogsphere 側はあくまで「その時点のスナップショットを置く場所」と割り切れます。
とはいえ、そもそもリポジトリ作るのがめんどくさい問題
ここまで読んで、
それはそうなんやけど、
そもそも課題ごとに GitHub リポジトリ作るのがめんどいんよな〜
と思った人もいるかもしれません。
僕も完全にそうでした。
42で課題をしていると、だいたいこんなラインナップが並びますよね:
Libftget_next_lineft_printfpipexpush_swapFdFpipexPhilosophersminishell- …
自分は「どうせやるんなら全部 GitHub で管理したい派」だったので、
- ローカルで
git init - GitHub で新規リポジトリ作成
- remote 設定
- 初回 push
を、課題ごとに毎回やっていて、正直だんだんダルなりました。
さらに、
- 42 関連リポジトリを Organization に分けたい
- でも Organization 作ったら今度は「全部作り直す」のも面倒
という問題も出てきて、「これはもう全部自動化するしかないわ!」となったんが、今回紹介するスクリプトの出発点です。
42-init_repos で課題用リポジトリを一括初期化する
そこで作ったのが 42-init_repos という Bash スクリプトです。
一言で言うと、
REPOSにリポジトリ名一覧を書いておくと、GitHub とローカルをまとめて初期化してくれる Bash スクリプト
です。
何をしてくれるのか
やってくれることは大きく 4 つ:
-
OWNER/REPOが GitHub 上に存在するかチェック - なければ GitHub に public リポジトリを作成
- Description / Topics を
gh repo editで自動設定 - ローカルに clone し、まだコミットがない場合は README を作って 初回コミット& push
これを REPOS の配列に入っている分だけループしてくれます。
中身は README やスクリプトを見てもらうとして、ここでは雰囲気だけ伝われば OK です。
基本の使い方(ざっくり)
詳しい説明はリポジトリの README に書いてありますが、流れだけ書いておきます。
1. リポジトリを clone / ダウンロード
git clone https://github.com/jiku0730/42-init_repos.git
cd 42-init_repos
2. 設定ファイルを編集する
42_repos_config.sh を開いて、自分用に書き換えます。
# GitHub ユーザー名 or Organization 名
OWNER="your-github-username" # 例: "jikuhar" や "42-your-org"
# ローカルのベースディレクトリ
BASE_DIR="$HOME/42-repos"
# 作成・設定したいリポジトリ名一覧
REPOS=(
"Libft"
"get_next_line"
"ft_printf"
"pipex"
"push_swap"
# "so_long"
# "FdF"
# ...
)
ポイントは OWNER です。
- 自分のアカウント直下に作りたい →
OWNER="自分の GitHub ユーザー名" - 42 用に Organization を作ってそこにまとめたい →
OWNER="その Org 名"
のように切り替えられます。
3. gh CLI のログイン確認
gh auth status
gh: command not found と言われたら、GitHub CLI が入っていないのでインストールが必要です。
(README に、Ubuntu / macOS / Windows それぞれ 管理者権限なしで入れる方法も書いてあります)
4. スクリプトを実行
chmod +x 42_init_repos.sh
./42_init_repos.sh
これで、REPOS に書いてある分だけ
- GitHub 上の
OWNER/<repo>を確認して、なければ作成 - Description / Topics 設定
-
BASE_DIR/<repo>に clone(既存があれば再利用) - コミットが無ければ README を作って初回 push
まで自動でやってくれます。
Organization を使う運用もかなり便利
個人的なおすすめは、
- 最初は
OWNER="自分のGithubのユーザー名"で使う - 慣れてきたら
OWNER="42-<intra-id>"みたいな 専用 Organization を作って切り替える
という運用です。
なぜ Organization がいいのか
- 個人アカウントのトップページが 課題レポジトリだらけにならない
- 42 関連のリポジトリを 1 箇所にまとめて見られる
42-init_repos の場合、42_repos_config.sh の OWNER を差し替えるだけなので、
OWNER="your-github-username"
# を
OWNER="42-your-org"
# に変えるだけ
という感じで簡単に切り替えられます。
まとめ:リトライ地獄を抜けるには「仕組み」を作るのが一番ラク
- 42 の課題はどうしても 数が多い
- リトライも含めてちゃんと管理しようとすると、Git / リポジトリ周りがすぐカオス
- 毎回手作業でリポジトリを作っていると、それだけでやる気ゲージが削られていく
そんな状況に対して、この記事で書いたのは、
- 自分の GitHub を「真の本番リポジトリ」にして、vogsphere は remote を 1 本足すだけにする運用
- その運用を支えるために、課題用リポジトリを一括で用意する
42-init_reposという小さなスクリプト
という 2 つの話でした。
- これから 42 に入る人の「最初の GitHub 整理」
- すでに 42 にいる人の「リポジトリ再整理」
- Organization での運用の導入
あたりに使ってもらえたら嬉しいです。
よかったらぜひ試してみて、
- 「ここもっとこうしたほうがいい」
- 「自分はこうカスタマイズしてる」
みたいなフィードバックも貰えるとめっちゃ最高です 🙌