3. Git などの使い方に関して

3.1. Git の使い方

プロジェクト管理系の道具は,使い慣れるまでは謎なことも沢山ありますが, 現状で開発のデファクトスタンダードツールであり, 情報系の学科だと知っていた方がいいので,ここでその触りだけでも勉強していきます.

3.1.1. この講義での Git 関連の役割

まず最初に,この講義で用いる git, github, github classroom についての 関連を図的に表したもので説明します.

digraph git_classroom { rankdir=LR; graph [fontname="sans-serif"]; node [fontname="sans-serif", shape=box, style="rounded,filled", fillcolor="#E6F1FB", color="#185FA5"]; edge [fontname="sans-serif", color="#444441"]; subgraph cluster_local { label="学生のPC"; style=filled; fillcolor="#E1F5EE"; color="#0F6E56"; env [label="pip install -e ."]; work [label="作業ディレクトリ"]; stage [label="git add/commit"]; work -> stage; work -> env; } subgraph cluster_github { label="GitHub"; style=filled; fillcolor="#E6F1FB"; color="#185FA5"; repo [label="学生リポジトリ"]; template [label="テンプレート"]; } subgraph cluster_classroom { label="GitHub Classroom"; style=filled; fillcolor="#EEEDFE"; color="#534AB7"; assign [label="Assignment"]; roster [label="Roster"]; } stage -> repo [label="git push"]; repo -> work [label="git clone", style=dashed]; assign -> repo [label="自動作成"]; template -> assign [label="参照", style=dashed]; }

git・GitHub・GitHub Classroom の関係

  • `git`: git はコード等のバージョンを管理するための道具です.コマンドとして PC に入っています. PC 内部の管理と,外部クラウドである github などへの通信を担います.

  • github: github は,コード管理をクラウド上で行う資源で,Web インターフェースで,git の管理状況が把握できるようにしているものです.ここではバックアップとして使っています.作成したプロジェクトは リポジトリ という単位で管理されます.

  • github classroom github を使って,課題作成などができるようにしたもので,主に教員が課題`Assignment` を出すために使います.Assignment では Github 内部のテンプレートを参照し,学生リポジトリへ クローンできるようにする仕掛けです.

3.1.2. Git (ぎっと) とは

分散ファイルリポジトリと呼ばれるシステムですが, ここでは

  • ファイルの バックアップ をとって, 記録 をするための道具

  • 課題の配布されたテンプレートを受領するための機能

だと思ってください. 実験のソースコードや書きかけのレポートなどがPCの故障や 操作ミスで消えるといた悲劇を防ぐための道具でもあります. (実際,卒論でやらかすケースがあります)

注釈

詳しく調べたい人がいれば

などを読んで下さい.

3.1.3. Git がやること

前述のとおり git は近年で最も用いられているバージョン管理システムのひとつです. バージョン管理システムとは,ファイルの作成・変更のログを管理するための システムで

「いつ」,「だれが」,「どのファイルに」,「どんな変更を」,「なんのために」

変更を行なったかを記録保存するためのものです. プログラムである git さんは,この要望に答えるために

  • 「いつ」→ 計算機の時間

  • 「だれが」→ 後ででてくる config で設定した名前とメールアドレス

  • 「どのファイルに」→ 以前のファイルとの差分

  • 「どんな変更を」→ 以前のファイルとの差分

  • 「なんのために」→ コミットメッセージと呼ばれる,ユーザーの文書

を記録することで解決を図ります.

要は,フォルダ内部のファイル状態の差分を記録し, 以前の状態のファイルを戻すことも出来るようにするための仕組みです

git 自体は世界中をカバーして開発環境を支えるために,通信機能を持っており, リモート (remote) アクセスを行い,他の人の開発環境と同期するこができます.

Github (https://github.com/) は,このリモート機能を駆使して, 世界中のソフトウェアの開発プロジェクトをまとめ上げるサイトです. 何か必要なコードがあれば,ここらへんのソフトウェアを使うことはよくある話です.

3.1.4. 導入(おまじない設定)

IED で動作させるための設定を書いておきます.

3.1.4.1. ユーザー名とメールアドレスの設定

gitを使う前に行わなければならない最低限のお作法があります. これは, 誰が 修正を行うかに関わったかを記録するのに必要な情報になります. この登録には git さんに 自分の名前メールアドレス を教えてあげることでできます.

まずは端末を開いて,下記のようなコマンドを実行してもらいます. ただし,ユーザー名とメールアドレスは自分のものを使用してください.

git config --global user.name "Hayaru SHOUNO"
git config --global user.email "shouno@uec.ac.jp"

メールアドレスは有効なものであれば,大学のじゃなくてもOKです. ただし, git からのお知らせは,ここに来るので,チェックしやすいものの方がよいです.

3.1.4.2. Proxy の設定

IED だと,なぜか,通信プロトコルで SSH を用いて Github との通信ができません. (方法があれば僕が知りたい.) そこで,HTTPS 通信を使っているのですが,こちらも proxy 環境でないと通信できません. なので, git さんに proxy の設定を教えてあげる必要があります.

git config --global http.proxy http://proxy.cc.uec.ac.jp:8080
git config --global https.proxy http://proxy.cc.uec.ac.jp:8080

のように設定してください.設定中 httphttps が混在しているので注意してください. なお,自分のPC環境で,この設定をすると git` で通信しようとするので問題が起こります. IED限定の設定と思ってください.

なお,自分のPC環境であれば,SSH通信を使うほうが,認証などが格段に楽になるので, そちらを使いましょう.(OSごとに環境が違うので要相談です)

3.1.4.3. エディタの設定

エディタ設定が必要になるのは,「なんのための変更をしたか?」を記載/編集するためです. この記載はコミットメッセージと呼ばれます. これは git commit というコマンドで行うのですが,これを実行するとコメントを付与することが要求されるので, これの編集に用いるエディタを指定します. 好きなエディタを設定してもらって構いません.

git さんの標準は vi (もしくは vim) か,nano と呼ばれる割と玄人が好きそうな エディタが標準で設定されています. これらは初心者/初級者向けかと言われるとちょっと首肯し難いです. 好きなエディタに変えたいといった場合は,

下記のリンクなどを参考に変えてみてください.

https://qiita.com/takeo-asai/items/9bc7e25cd94cd8c9adee https://help.github.com/ja/github/using-git/associating-text-editors-with-git

なお,このガイド文書では混乱を避けるためにコミットのメッセージは -m オプションで

$ git commit -m 'なんたらかんたら'

という形で与えることで,一応設定しなくてもいいようにはしています. -m オプションを指定しないと vi が立ち上がるので,あれが怖い人はエディタを設定しておいてください.

3.1.5. Git の基本サイクル

この演習では,

  1. Github 側で課題を取得(課題リンクを踏むことで取得)

  2. Github 側でテンプレート更新

  3. Github から git clone (もしくは git pull)を使って,課題などの資料を手元にとりよせ(更新)

  4. 取り寄せたファイルを jupyter lab などの環境を使ってコード編集,実験

  5. 作業を中断する場合(区切りがついたとか,疲れたとか), git add, git commit でバックアップを更新

  6. さらにバックアップを保持したい場合は, git push で Github の方へ更新を反映させる

  7. 課題が終了したら Github で,Pull Request を作成して,提出する

という 1~5 のサイクルを回します.

3.1.6. 記録保存のタイミング

記録保存 git commit のタイミングですが,これはいろいろな流儀があります. とにかくきれいなコミットログしか残したくない人もいれば, タスクが残っていても時間がきたら次の編集機会に持ち越していくスタイルの人もいます.

この実験では講義で使っているファイルのバックアップ目的なので, できるだけ細かい粒度で行うことを心がけてください. 特にレポート課題作成などでは,思考の変遷を追っかけたい場合もあるので 最低でも一日一回git commit を行ってください.

まとまってからなんかするとかいう考え方は開発において大抵は失敗します. 細かいスパンで git commit をしましょう. 慣れてきたらもっと粗い粒度でのタイミングを考えましょう.

3.2. Github の使い方

3.2.1. Github とは

Git がファイルリポジトリを操作するためのコマンド群であることは述べましたが, git init, git add, git commit といった流れは, あくまで 自分の手元の計算機に バックアップを取るための操作で, 外部へ記録を移管したりしているわけではありません.つまり自分の計算機が 壊れてしまった場合,全ての変更記録が失われることになります. そのようなことになる前に,リモート操作で外部に保存をしましょうというのが ここで述べる趣旨になります. このようなリモート操作は現在は,Web アクセスを介して行われるのが今風の使い方です. これをホスティングサービスとして実施してくれている最大手が Github と呼ばれる Webサービスです.

まずは,

https://github.com

をアクセスしてください.

注釈

なお,Github ヘルプの公式ドキュメントはこちらから読めます

https://help.github.com/ja/github/getting-started-with-github

3.2.2. 導入: アカウント登録

まず Github のアカウントを手に入れましょう. まだアカウントを持っていない人は sign up を選択してください. すでに持っている人は, sign in をしてログインしてください. 大学と個人のアカウントを使い分けたい場合は,あたらしいアカウントを作るのもありです.

以下では sign up の流れについて説明します. 必要なものは確認可能な メールアドレス になります. アカウント作成の確認,リポジトリ変更などのお知らせは,このメールアドレスに来ます.

学校のメールアドレスもしくは gmail 等のメールアドレスを指定すると良いでしょう. 下記のようにユーザー名とメールアドレスを適宜設定してください.

  1. sign up を選ぶ

    _images/githubjoin1.png
  2. 次に料金プランを聞かれますが,ここでは 無料のプラン を選ぶで問題ありません.

    _images/githubjoin2.png
  3. 最後に嗜好などを聞かれますが適宜答えて大丈夫です.

  4. 最後に 'Submit' ボタンを押してもらって大丈夫です.

  5. 登録すると github から確認のメールがくるので,そのリンクを踏んで登録作業終了になります.

これで, git clone によるローカルへのリポジトリのダウンロードや git push によるリポジトリの同期が取れるようになります. リモートリポジトリが簡単に作れるようになります. 最後に下のような画面にたどり着けば アカウント作成は終了です.

_images/githubjoin4.png

3.2.3. Github との通信に関わること

3.2.3.1. Github への HTTPS 通信の方法

2021/08/13 から github 上のリポジトリに https 通信でのアクセスする際に, パスワード認証ができなく なりました. アクセスするには Personal Access Token という Github で発行するパスワード代わりのものを使う必要があります. 取得するには以下の手順を踏んでください.

  1. Personal Access Token を得るには Github にサインインして,なにかリポジトリを開きます.

  2. 右上に自分のアイコンがあるので,そこから Settings を選びます.

  3. 遷移した画面の左側のリストから Developper Setting を選びます.

  4. 遷移した画面の左側のリストから Personal access tokens を選びます

  5. Generate new token を選びます

  6. Note に適当な注釈(たとえば IED で使うなど)を入れて,有効期限 (60日くらい),repo にチェックを入れて生成します.

  7. すると ghp_XXXXXXXXXXXXXXXXXX 的な文字列が生成されます.これを認証パスフレーズとして用いればアクセスができます.

ここまでで,鍵の生成が終わりで,これを使えば github のリポジトリにアクセスできるのですが, 毎回認証パスフレーズを打つのは大変なので,使用している端末に覚えさせることにします.

Mac, Linux の場合は ~/.netrc へ記述すれば覚えてくれます. この方法はセキュリティ的には脆弱ですが,一番手間がかからないですので, この方針を採用しています.

なお,自分のPCでも作業する人は ssh 通信を使う方が確実なので,そちらを使うことをお勧めします.(設定は要相談)

machine github.com
login (githubへのログイン名)
password (パスフレーズ ghp_XXXXXXXXXXXXXXXXXXみたいなやつ)
protocols https

のようにファイルを作成してください.()の中身は自分のものに置き換えてください

これで,パスワードなしにリポジトリにアクセスできるはずです (Personal Access Token の有効期限がきれるまでは)

3.2.4. Github 上のリモートリポジトリを複製して使う

課題での使い方はこれが該当します.

リモートリポジトリを複製 (git clone) してから使う方法を考えます. これは,別の計算機でクローンを行ってから開発したい場合などに用います.

先ほどの HelloPython プロジェクトをクローンして,ローカルマシン上の 別ディレクトトリに複製してみましょう.

リポジトリ画面の右上に "Clone or download" ボタンがあります. これを押すと,リモートリポジトリ名がでてくるので,この文字列を コピーします.

次は,端末での作業にもどります. 適当なフォルダ上に HelloPython プロジェクトを展開してみます. これには git clone を用います. git clone の引数にはコピーしたリモートリポジトリの文字列を与えます.

$ git clone git@github.com:Githubユーザー名/HelloPython.git

のような形で,複製ができます. Githubユーザ名 の部分は前述と同様に github のアカウント名になります. なお,この部分は githubCode と書いてあるボタンの CloneSSH と書いてあるボタンを選択すると,この文字列がコピーできます. あとは,このフォルダでいじり,git add, git commit, git push のサイクルを回せばOKということになります.

3.2.5. リモートリポジトリとの同期

リモートリポジトリの方が更新が進んでいる場合は, (複数環境で更新作業を行っているとしばしば起こる) 最新版に更新したいことが多くなります.この場合紐付けが終わっているのであれば git pull を行うことで,同期がとれます. ただし,リモートの更新で現在の編集作業が上書きされる可能性があるので, 作業開始前に確認することが重要です. git pull 自体は非常に簡単で,紐付けが終わっているリポジトリであれば

$ git pull

を行うことで,最新の状態に保つことができるようになります.

複数の環境で,同時多発的に更新を行うと,どの更新を採用すべきか git さんは判断できなくなります. このことを 衝突 とか conflict が起こるといいます. これがおこると,マージ作業を手作業で行わないといけないケースが出てきます.注意すれば一応マージはできます.

ただし,このような衝突がおこらないように github にあるリポジトリが最新であるように, 作業の開始時には git pull , 作業終了時には git push を行うような習慣づけるのが望ましいでしょう.

3.2.6. おまけ:

3.2.6.1. Github Education student pack の獲得

Github では,学生を支援するためにかなりの有償のソフトウェアパッケージを 提供してくれています. github アカウントを取得後,学生の人はこれを使うと良いでしょう.

https://education.github.com/pack

から Get your packI am a student の順にたどっていくと 名前, メールアドレス, 学校名, 卒業年, Github をどう使うのか を聞かれるページに遷移します.

_images/StudentPack.png

問題になるのはメールアドレスと最後のどう使うかの欄です. github への登録メールアドレスを gmail などの非教育機関から登録すると 弾かれます.ですので uec.ac.jp などのドメインのメールアドレスを登録する必要がでてきます.(いわゆる UEC メールです) もし,gmail などで登録しちゃっている場合は,github に sing in して setting の e-mail に自分の UEC メールを登録してください. それで,ここの欄の school-issued email address を選択することができるようになります.

最後の How do you plan to use Github は, I'd like to use Github for computer language class experiment などと答えて於けばよいかと.

なお,Github Copilot はこのパックに含まれているので,これを使いたい人は選択してください.(普通に賢いです) なお Github Copilot を Visual Studio Code で使うための記事を書いてくれている先人もいるので,参考にしてください.

https://qiita.com/SNQ-2001/items/796dc5e794ac3f57a945

3.3. Github classroom

3.3.1. Github classroom とは

Github classroom は,Github を用いた授業支援プロジェクトです. コードのレビューや,採点などに使うことができます.

Github は,無償プランでは,基本的に全世界に公開 (public) リポジトリとなります. 採点やレポート提出には,他の人に見られないような私的 (private) なリポジトリが必要です. Github classroom でのレポート課題のリポジトリは,他の人に見えないような private な リポジトリとなっていますので誰かに覗かれる心配は(パスワードなどがクラックされない限り)ありません.

ここでは,課題提出に関わる部分だけを説明します.

3.3.2. Github classroom の使い方

3.3.2.1. クラスルームからの課題の取り込み

まず,下記にアクセスしてください.

github にログインしていれば,最初の段階で受講曜日+学籍番号のリストが出てきますので該当する id を選んでください.

_images/Roster.png

うっかり,間違って他人の id を選択した場合は,教員まで知らせてください. そのまま使った場合,他人の学籍番号に紐づけられてしまいます. また,自分の id がない場合も,教員まで知らせてください.こちらで id と github アカウントの紐づけを操作します. この id は,皆さんの github のアカウントに紐付けられます.

次に,課題を受け入れるか (accept) するかどうか,を聞いてきます. 受け入れるとテンプレートが github 上で,一人ひとりのリポジトリとしてコピー(clone)されます.

_images/AssignmentAccept.png

クローンされるまで待ってください. うっかりキャンセルなどすると,課題のためのコードがコピーされない空のリポジトリが出来上がる場合があります. そうなった場合は,各人の github 上のリポジトリを消去するしかなくなるので,教員まで知らせてください.

これで,課題のテンプレートが各自に配布されたことになります.

3.3.2.2. 操作しているPCへ複製

次に,github 上のリポジトリにクローンされた各自の課題を,自分の PC へもって(クローン)してきます. クローンのやり方は, Github 上のリモートリポジトリを複製して使う を参照してもらえればよいですが, git clone を使います. github の "clone or download" ボタンを使い, リンク先の URL をコピーします.それを使って,端末上で

1git clone 'コピーしたURL'

とすることで,リポジトリのコピーが自分の使っているPCに落ちてきます. 後の編集作業は自分の PC で行ってもらってOKです. なお,転送には https を使います (IED では ssh 転送はできないので).

_images/GithubClone.png

3.3.2.3. 編集作業と更新作業の記録

リポジトリ内にファイルを追加したり編集したりしてください. 今回の作業では, README.md というファイルの学籍番号と氏名のところを 適宜修正することをすることが最小限の作業になります.

その他,色々なファイルを追加してみたりしてから

  1. リポジトリに管理させるファイルを git add コマンドを使って追加し

  2. git commit を使って,今使っている PC のデータベースに保存します.

この段階で,更新作業の差分が記録されます.

3.3.2.4. Github へのアップロード

次に github へアップロードをかけます.この操作はローカルに作業した更新記録を Github 上に反映させることになります. この操作には git push を使います.

git push

で通るはずです. (なおブランチを切るなどの作業をした場合は git push -u origin ブランチ名 のように,ブランチ登録が必要となります)

3.3.2.5. クラスルーム上の課題の更新

また,各週の作業開始時点で,github 上のリポジトリのテンプレートを更新します. これは,授業の進行に合わせて,課題のテンプレートを更新するために行います. github classroom の課題のページに行き,右上の Update template ボタンを押してください. これをしないと,各週の課題のテンプレートが更新されません.

さらに,自分の PC 上のリポジトリも更新する必要があります. これには, git pull を使います. git pull は,github 上のリポジトリの内容を自分の PC 上のリポジトリに反映させるコマンドです. git pull を使うと,github 上のリポジトリの内容が自分の PC 上のリポジトリに反映されます.