👏

Gitのチェックアウト時にGoogleDriveの公開データをダウンロードする

2021/11/12に公開

GitでチェックアウトしたタイミングでGoogleDriveのファイルをダウンロードするメモです。

  • Windows 10
  • Gitのチェックアウト時にGoogle Driveの公開ファイルをダウンロードする
  • ファイルサイズは100MB超

動作確認用に仮ファイルを作成する

テスト用に101 * 1024 * 1024 = 105906176 byteのファイルを作成します。

Windowsで特定のサイズのファイルを作成する場合、fsutilコマンドが便利です。

command prompt
fsutil file ceateNew "bigfile.dat" 105906176

0で埋め尽くされた101MBのファイルが作成されます。

GoogleDriveのでファイルのIDの確認する

上記のファイルをGoogleDriveにアップロードして、公開設定に変更します。

  1. GoogleDrive上でアップロードしたファイルを右クリック
  2. メニューから[リンクを取得]を選択
  3. 公開範囲を[リンクを知っている全員]に変更

また、表示されているURLの以下のXXXXXの部分がファイルのIDになるので、メモしておきます。

https://drive.google.com/file/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/view?usp=sharing

チェックアウト時にフックを起動する

Gitの特定のアクションのタイミングでカスタムスクリプトを実行する方法として、Gitフックがあります。
https://git-scm.com/book/ja/v2/Git-のカスタマイズ-Git-フック

今回は、チェックアウト時に実行するGitフックを作成します。

  • .git/hooks/フォルダ下にpost-checkoutという名称のファイルを作成する
  • 拡張子は不要

GoogleDriveからファイルをダウンロード

以下のQiita記事に掲載されているシェルスクリプトを参考に、post-checkout内にGoogle Driveからファイルをダウンロードするシェルスクリプトを追加します。

https://qiita.com/namakemono/items/c963e75e0af3f7eed732

post-checkout
#!/bin/sh
FILE_ID=メモしたファイルのID
FILE_NAME=ファイルの保存先
curl -sc ./cookie "https://drive.google.com/uc?export=download&id=${FILE_ID}" > /dev/null
CODE="$(awk '/_warning_/ {print $NF}' ./cookie)"  
curl -Lb ./cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=${FILE_ID}" -o ${FILE_NAME}

設定ファイルからIDと保存先を読み込む

これで、一通りGoogle Driveからのファイルのダウンロードはできるのですが、幾つかのファイルをまとめてダウンロードできるようにしたかったので、以下のようなcsvファイルからFILE_IDとFILE_NAMEを読み込むよう変更します。

download.csv
file_id,file_name
FILE_ID1,FILE_NAME1
FILE_ID2,FILE_NAME2
post-checkout
#!/bin/sh
DOWNLOAD_CSV="download.csv"

# 1行目を飛ばして、2行目以降のみを読み込む
tail -n +2 ${DOWNLOAD_CSV} | while read line ; do

    # lineからFILE_IDとFILE_NAMEを抽出
    FILE_ID="$(echo ${line} | awk -F',' '{print $1}')"
    FILE_NAME="$(echo ${line} | awk -F',' '{print $2}')"
    
    # ダウンロード
    curl -sc ./cookie "https://drive.google.com/uc?export=download&id=${FILE_ID}" > /dev/null
    CODE="$(awk '/_warning_/ {print $NF}' ./cookie)"  
    curl -Lb ./cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=${FILE_ID}" -o ${FILE_NAME} 
    rm ./cookie
done

後記

諸事情により実際には使用していないため、実用に耐えるかどうかは不明です。現状、チェックアウトの度にダウンロードが発生することになるので、ファイルの更新チェックを行い更新されている場合のみダウンロードする、等の仕組みは必要になると思われます。

Discussion