各種ファイル共有方法と Git によるバージョン管理 - 情報処理IIレジュメ(2)

はじめに

産技高専電気電子工学コースでは、用途に応じて様々なICTツールを活用している。オフィシャルに用意されているものも含めて、説明をしておく。また、後半では主にテキストファイルのバージョン管理を行う Git について説明する。

各種 ICT ツールの紹介

1. 校務支援システム

主にシラバス閲覧、成績開示、授業アンケートなどを行う。

2. Google Classroom

学校としてのオフィシャルな掲示板。昨年度から教務室・学生室・教務学生係・キャリア支援センターなどがオフィシャルな連絡をしてくれるようになった。電気電子の学生は基本は見ているだけで Ok。

3. moodle

コースとしてのオフィシャルな LMS。重要なお知らせは各クラスのアナウンスで流れるので、通知に注意すること。クラス以外にも科目ごとにコースが作成され、課題などが科される。また、ICT活用計画や進路など授業に関係ないコースも作成されるので、各自確認しておくこと。

4. Slack

本コースでは BYOD が始まる 3年生からクラス運営のために活用しているチャットツール。日々の連絡、担任からのHR連絡、雑談、科目ごとの課題の共有、各種調査などリアルタイムに必要な情報共有は主にここで行われる。昨年度は、入院などで学校にしばらく来れない期間があった場合などに、他の人がその期間のノートを共有してあげたりと色々と活用されていた。是非活発に活用してほしい。

5. Google Drive

学校として G Suite を契約しているため、メール以外に容量無制限の Google Drive が利用できる。特に、以下のページからインストールできる Google ドライブファイルストリームをインストールすると、この Google Drive がそのままネットワーク共有ドライブのように活用できる。→ ドライブ ファイル ストリームを導入する

6. Google Documents

Google Documents (Word のようなもの)、Google Spreadsheet (Excel のようなもの)、Google Slides (PowerPoint のようなもの)の総称。複数人で共有編集できるので、グループワークなどにおける班提出資料の作成などで多く使われている。詳細は授業中にデモを使って説明する。

Git によるバージョン管理

後期の情報処理IIIの授業では、ペアプログラミングを実施する。ペアプログラミングでは、二人でテスト・実装を分け合って記述するため、ソースコードを共有する必要がある。本コースでは Git という分散リポジトリシステムを活用している。ファイルに変更があるごとに差分をコミットし、必要があれば任意のタイミングのコミットに戻したりすることも可能となる。外部のリポジトリサーバ(本コースでは Bitbucket を利用)を経由することで、複数人でリポジトリを共有することも可能となる。ここでは、最初に既存のフォルダからリポジトリを作成する方法を説明する。次に Bitbucket に設定済の共有リポジトリから、自分のフォルダにクローンを作成し、複数人でリポジトリ共有をする演習を行う。

なお、macOS については、以下の作業で必要になるのでおすすめの設定(macOS) - BYOD PC のセッティング(7) - hkob’s blogに追記した iTerm2、fish、FingerGo をインストールしておいて欲しい。

1. 既存のフォルダをリポジトリに設定

レジュメ(1)で作成した「LaTeXtest」フォルダをリポジトリにしたい。もし、レジュメ(1)で「LaTeXtest」というフォルダに入れていなかった場合には、ここで作成しておくこと。以下、箇条書きで説明を記述する。

  • 公開鍵の Bitbucket への登録をする。機種ごとにやり方が少し異なるので、設定の画面に追記した。すでに設定済の人は追記分を実行してほしい。→

  • 新規リポジトリを作成する。macOS 版は「新規..」から「ローカルリポジトリを作成」、Windows 版は「Create」ボタンをクリックする。

    f:id:hkob:20200410094909p:plainf:id:hkob:20200410095221p:plain
    新規リポジトリを作成

  • 次にリポジトリの場所を設定する。macOS 版はパス名の横の「...」を、Windows 版はパス名の横の「参照」をクリックして、前回作成した「LaTeXtest」フォルダを選択する。実は、ここでリモート(BItbucket 側)のリポジトリも作成できるのだが、Bitbucket 側のやり方も知っておいてもらいたいので、わざと作成しないでおく(後で自分でリポジトリを作成する時にはチェックを入れても構わない)。Windows 版ではすでにフォルダがあると警告が出るが、そのまま進める。macOS 版では作成後、リストに「LaTeXtest」の名前が出るだけなので、ダブルクリックして開く。

    f:id:hkob:20200410095721p:plainf:id:hkob:20200410095737p:plain
    リポジトリの場所の設定

  • これでリポジトリの管理画面が開く。若干画面表示が異なるが、内容は同じである。作成したばかりで、リポジトリは空であり、不明なファイルが5つあるのは共通である。LaTeXtest.tex は作成したファイルだが、残りの log (ログファイル)、aux (相互参照番号などの記録ファイル)、sync.gz (tex と pdf の相互位置を記録したファイル)、pdf (組版した結果)の4つのファイルは、自動生成したファイルである。後者の4つはバージョン管理する必要はないので、これらを無視する設定を行う。

    f:id:hkob:20200410100828p:plainf:id:hkob:20200410101152p:plain
    リポジトリ表示画面

  • 後述の作業でターミナルで作業をしたいので、SourceTree からターミナルを開く。ただし、macOS 版は 4.0.1 のバージョンでバグがあり、「端末」ボタンを押してもカレントディレクトリが変更されないという問題が残っている(古いバージョンから使い続けている人は問題ないようだが、新規インストールだと動作しない)。また、Windows 版はターミナルをクリックすると、PowerShell ではなく Git bash という別のターミナルが開いてしまう。こちらも面倒なので、どちらの環境も Finder や Explorer を経由してターミナルを開く方法を説明する。macOS の場合には上記画面の「Finder で開く」ボタン、Windows の場合には「Explorer」ボタンをクリックする。

  • macOS の場合にはタスクバーに設置した「FinderGo」の亀アイコン、Windows の場合には「シフトキー」を押しながらマウスの右ボタンをクリックして「PowerShell ウインドウをここで開く」をクリックする。

    f:id:hkob:20200410154727p:plainf:id:hkob:20200410154753p:plain
    Finder、Explorer からターミナルを開く

  • 成功すると以下のようにカレントディレクトリが変更された状態でターミナルを開くことが確認できる。

    f:id:hkob:20200410155104p:plainf:id:hkob:20200410155108p:plain
    開かれたターミナル(カレントディレクトリが移動している)

  • gitignore.ioにアクセスする。出てきた画面に「LaTeX」「macOS」「Windows」などを入れて「Create」をクリックする。

    f:id:hkob:20200410112226p:plain
    gitignore.io

  • ブラウザ画面に .gitignore のテキストが表示される。macOS の場合には「Command + A」を押して全テキストを選択し、「Command + C」でクリップボードにコピーする。Windows の場合には「Control + A」を押して全テキストを選択し、「Control + C」でクリップボードにコピーする。

  • macOS の場合には、以下のコマンドでクリップボードの内容を「.gitignore」ファイルに保存する。pbpaste はクリップボードの内容を標準出力に出力するコマンドである。それをリダイレクトで「.gitignore」というファイルに保存している。

pbpaste > .gitignore
  • Windows の場合には、以下のコマンドでクリップボードの内容を「.gitignore」ファイルに保存する。PowerShell における Get-Clipboard コマンドは、macOS における pbpaste コマンドと同じである。PowerShell の場合、デフォルトのエンコーディングが UTF-16 なので、Out-File コマンドでエンコーディングを変更する(今回は、ASCIIだけなので asciiにした。本当は utf-8 にしたいのだが、残念ながらデフォルトでは BOM 付きしか設定できないため)。
Get-Clipboard | Out-File ".gitignore" -Encoding ascii
  • .gitignore のおかげで、「LaTeXtest.pdf」以外の余計なファイルは見えなくなった。コンピュータにとって、「LaTeXtest.pdf」が不必要であることは推測できないので、これだけは手動で .gitignore に登録する。どちらも LaTeXtest.pdf の上で右ボタンを押して「無視...」をクリックする。

    f:id:hkob:20200410162323p:plainf:id:hkob:20200410162406p:plain
    右ボタンで「無視...」を選択

  • どちらも「無視する範囲」を「このリポジトリのみ」に設定して、「名前に一致するファイルを無視」として「OK」を押す。

    f:id:hkob:20200410163012p:plainf:id:hkob:20200410163023p:plain
    このリポジトリのみに「LaTeXtest.pdf」を追加

  • こうすると「.gitignore」「LaTeXtest.tex」のみが候補に残ったことになる。この状態で最初のコミットを行う。macOS の場合には、左上のコミットボタンを押したのち、二つのファイルにチェックマークをつける(上のチェックボックスをクリックしてもよい)。Windows の場合には、選択項目をインデックスに追加(または全てインデックスに追加」をクリックする。その後、下のメッセージ欄に「first commit」のようにメッセージを記述して、「コミット」ボタンをクリックする。これで最初のコミットが終了する。

    f:id:hkob:20200410163600p:plainf:id:hkob:20200410163612p:plain
    最初のコミット

  • 次にファイルを更新してみる。Finder (macOS)、Explorer(Windows)から「LaTeXtest.tex」をクリックして TexShop(macOS)、TeXworks(Windows) を起動する。せっかくなので、日付を今日に変更してみる。タイプセットして、PDF が書き換わったことを確認したら、SourceTree の画面に戻ってみる。

\date{令和2年 4月 10日 (金)}
  • SourceTree に戻ると先ほどコミットした「LaTeXtest.tex」がオレンジ色で再度表示されていることがわかる。ここで、「LaTeXtest.tex」をクリックしてみると前に書いた日付が赤色で「-」、書き換えた日付が緑色で「+」で記載されていることがわかる。リポジトリにはこの差分情報のみが記録される。ここにあるように「日付の変更」として再度コミットしてみる。

    f:id:hkob:20200410164805p:plainf:id:hkob:20200410164816p:plain
    差分のコミット

  • ここでこれまでの履歴を確認してみる。「ファイルステータス」の下の「履歴」(macOS)または「History」(Windows)をクリックしてみる。するとここまでの二つのコミットが順に表示されていることがわかる。確認したら「ファイルステータス」に戻しておくこと。よほどのことがない限り、過去のファイルに戻したいということはそんなにないと思うが、どうしてもやり方が知りたい人は自分で調べるか私まで連絡して欲しい。

    f:id:hkob:20200410165709p:plainf:id:hkob:20200410165728p:plain
    履歴表示

2. 手元のリポジトリを Bitbucket に新規登録

一台のマシンでリポジトリ管理するのも便利だが、外部にリポジトリを保存すると、マシンのトラブル時や複数台のマシンでの共有、今後実施するペアプログラミングなどの際に活用できる。ここでは、先に登録してもらった Bitbucket へのリポジトリ登録方法を説明する。ブラウザ画面については、ほとんど同じなので macOS の Safari の画面のみを掲載する。

  • Bitbucket にログインし、左側の「+」をクリックする(左図)。ポップアップメニューから「CREATE」の下の「リポジトリ」をクリックする(中央図)。出てきたウインドウで、リポジトリ名を「LaTeXtest」、READMEを含めますか?を「No」、プログラミング言語を「LaTeX」として「リポジトリの作成」をクリックする。

    f:id:hkob:20200410170906p:plainf:id:hkob:20200410170903p:plainf:id:hkob:20200410170855p:plain
    新規リポジトリの作成

  • 次のような画面になるので、「パケツに何かを入れましょう」の下に「SSH」と書かれていることを確認した上で、文字列の右側の「Copyアイコン」をクリックする。

f:id:hkob:20200410171556p:plain
新規リポジトリ画面

  • SourceTree の画面に戻り、右上の歯車アイコンの「設定」をクリックし、「リモート」タブを表示する。ここで「追加」ボタンをクリックする。

    f:id:hkob:20200410172025p:plainf:id:hkob:20200410172038p:plain
    SourceTree - 設定 - リモート

  • リモートの名前(リモート名)は「origin」、URL/パスに先ほどコピーした文字列を貼り付ける。その後、頭についている「git clone 」という文字列を消して、「git@bitbucket.org」から始まる文字列だけを残す。設定ができたら、「OK」を押す。

    f:id:hkob:20200410172750p:plainf:id:hkob:20200410172801p:plain
    リモートリポジトリの登録
    (裏話) ここで macOS 版と Windows 版で別々に作業したので、二つのリポジトリは異なるものである。このまま二つのリポジトリを両方 Bitbucket に push することはできない。そこで、最初に Windows 版のみを動作させスクリーンショットを記録する。その後、macOS の方は、サーバ側のリポジトリを消して再度実行することでスクリーンショットを取り直す。

  • 先に Windows 版を説明する。最初に「プッシュ」をクリックして表示されたダイアログで「master」の横のチェックボックスをクリックし、プッシュをクリックする。

    f:id:hkob:20200410201314p:plain
    プッシュの設定

  • bitbucket のキーの確認が表示されるので、「はい」をクリックする。

    f:id:hkob:20200410205613p:plain
    キャッシュの確認

  • プロセスを再起動する必要があると表示されるので、「OK」をクリックする。実際にプッシュが進まなかったので、再度プッシュをやり直したらうまく動作した。

    f:id:hkob:20200410205116p:plain
    再実行の警告画面

  • 次に macOS 側を説明する。以前は macOS 版はトラブらなかったのだが、今回はうまく動作しなかった。そこで、Windows 版で自動で設定できたキャッシュの登録を手動で行う(SourceTree 4.0 に上げてから不具合が目立つ気がする)。iTerm2 を開き、ssh で bitbucket.org に接続し、キーを登録する。

> ssh bitbucket.org
The authenticity of host 'bitbucket.org (18.205.93.1)' can't be established.
RSA key fingerprint is SHA256:zzXQOXSRBEiUtuE8AikJYKwbHaxvSc0ojez9YXaGp1A.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'bitbucket.org,18.205.93.1' (RSA) to the list of known hosts.
PTY allocation request failed on channel 0
logged in as hkob

You can use git or hg to connect to Bitbucket. Shell access is disabled
Connection to bitbucket.org closed.
  • ここでキーが登録されれば、Windows 版と同様に処理をすればよい。まず、SourceTree でプッシュをクリックし、「master」の横のチェックボックスをクリックし、「OK」をクリックする。

    f:id:hkob:20200410210430p:plain
    プッシュの設定

  • 場合によっては出ないかもしれないが、パスワード要求があったら Bitbucket のパスワードを入力する。

    f:id:hkob:20200410210446p:plain
    パスワード要求

  • 詳細をみると、git push が成功していることがわかる。

    f:id:hkob:20200410210502p:plain
    進捗の詳細画面

  • この後は、ローカルでコミットし、成功したらプッシュすることで Bitbucket にもリポジトリのバックアップが保存されることになる。

3. 既存のリポジトリのクローン

ここでは私が用意したリポジトリを各学生がクローンし、自分の担当分を編集してコミット・プッシュする練習を行う。投票で Bitbucket の設定が終わったと宣言した学生に対して、私のリポジトリの書き込み権限を付与する。リポジトリの招待を受けたら、Bitbucket にログインすると「test_ip3300_2020」というリポジトリが見えるようになる。表示された画面で「クローンを作成」というリンクをクリックする。下のような画面が表示されるので、「Clone in Sourcetree」というボタンをクリックする。

f:id:hkob:20200410211712p:plain
クローンを作成

すると macOS 版、Windows 版ともにダイアログが現れるので許可する。

f:id:hkob:20200410211931p:plainf:id:hkob:20200410211946p:plain

ここから macOS 版と Windows 版で対応が異なったので、別々に表記する。macOS 版は以下のようなダイアログが表示される。このままだとホームディレクトリの直下にファイルを作成してしまうので、LaTeX フォルダの下にさらに test_ip3300_2020 というフォルダを作成して、そこに保存することにする。まず、フォルダ名の右の「...」をクリックし、LaTeX フォルダ、test_ip3300_2020 フォルダを作成する。

f:id:hkob:20200410213113p:plain
新規にクローン

test_ip3300_2020 が選ばれたところで、開くをクリックする。

f:id:hkob:20200410213525p:plain
フォルダを作成

以下のようにフォルダ名が変わったことを確認して、「クローン」をクリックする。

f:id:hkob:20200410213647p:plain
クローン画面(フォルダ名変更)

Windows は SourceTree が開くものの URL がうまく引き継がれないようだった。仕方ないので、SourceTree を開き、タブの「+」をクリックした後で、「Remote」をクリックする。以下の図のようにアカウントが見えているのと思うので、下の「アカウントを編集」をクリックする。

f:id:hkob:20200410215646p:plain
リモートリポジトリ

アカウントを表示すると「プロトコル」の部分が「HTTPS」になってしまっている。ここで編集をクリックする。

f:id:hkob:20200410215813p:plain
アカウントの表示

優先するプロトコルを「SSH」に変更する。「OK」ボタンが押せなくなっている場合には、「OAuthトークンを再読み込み」とするとブラウザが開く。SourceTree に戻すと下の画面のように「認証に成功」という文字が書かれて「OK」が押せるようになる。「OK」を押すとプロトコル変更が成功する。

f:id:hkob:20200410220112p:plain
プロトコルをSSHに変更

元の画面に戻り、右に表示されるリストから「test_ip3300_2020」を選択する(私の場合は保有しているリポジトリが多すぎるのでリポジトリ名をタイプして絞り込んでいるが、学生は2個しか表示されていないのでタイプの必要はない)。ここで、test_ip3300_2020 の右にある「Clone」をクリックする。

f:id:hkob:20200410215032p:plain
Remote からクローン

これで macOS と同様にクローンの画面になる。デフォルトで Documents の下の test_ip3300_2020 にクローンされる。もし場所を変えたければ、右の参照で変更するとよい。最後に「クローン」をクリックする。

f:id:hkob:20200410220710p:plain
リポジトリをクローン

macOS では Finder、Windows では Explorer を開くと、各学生ごとのファイルが保存されていることがわかる。ここから自分のファイルを開き、タイプセットを実行する。実は、1行目の% !TEX root =main.tex という行により、TexShop においても TeXworks においても、自動的に main.tex がタイプセットされるようになっている。

4. 複数人でのリポジトリ管理 (演習課題)

上記のクローンが設定できたら、自分の学生番号のファイルを自分の環境に合わせて書き換えること。タイプセットしてコンパイルが正しく実行できたら以下の手順で、プル、コミット、プッシュを実行する。 * 注釈: 通常は、複数人が同じファイルを編集する可能性があるので、コミット→プル→必要ならコミット→プッシュという形になるのだが、今回は同じファイルを編集する可能性が全くないため、最初のコミットを省略することにする*

  1. 自分のファイルを編集する
  2. タイプセットする
  3. 結果を確認して、正しくタイプセットされていることを確認する
  4. SourceTree にて、「プル」を実行する。これにより他人が編集した内容が自分のリポジトリに保存される
  5. 2 で実施した手順でコミットする。
  6. 同様にプッシュを実行する。もし、他人のプッシュとかぶってエラーが出た場合には、プルからやり直す。
  7. 履歴で正しくプッシュできたことを確認する。

この課題はリポジトリで確認できるので、課題自体を moodle で提出する必要はない。結果は、課題2のところで確認できる。moodle の通知を確認すること。

かなり長くなってしまったが、これが2回目、3回目の授業内容である。

hkob.hatenablog.com