👏
Gitのチェックアウト時にGoogleDriveの公開データをダウンロードする
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にアップロードして、公開設定に変更します。
- GoogleDrive上でアップロードしたファイルを右クリック
- メニューから[リンクを取得]を選択
- 公開範囲を[リンクを知っている全員]に変更
また、表示されているURLの以下のXXXXXの部分がファイルのIDになるので、メモしておきます。
https://drive.google.com/file/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/view?usp=sharing
チェックアウト時にフックを起動する
Gitの特定のアクションのタイミングでカスタムスクリプトを実行する方法として、Gitフックがあります。
今回は、チェックアウト時に実行するGitフックを作成します。
- .git/hooks/フォルダ下にpost-checkoutという名称のファイルを作成する
- 拡張子は不要
GoogleDriveからファイルをダウンロード
以下のQiita記事に掲載されているシェルスクリプトを参考に、post-checkout内にGoogle Driveからファイルをダウンロードするシェルスクリプトを追加します。
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