それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

git lfs でバイナリファイルをバージョン管理できるようにする

git レポジトリに大きめのファイルを突っ込みたい。

動画の素材ファイルや、画像の素材ファイルとか、Sketch とか figma のデータそのままとか、コンパイルしたExecをそのままとか、考えるの面倒くさいのでどっかに放り込んでいきたい。

google drive に放り込んでいたけど、バージョン管理に時間制限があって、30日前になる。かといってDropboxまで追加で契約すのも面倒くさい。Evernoteは添付ファイルに容量制限があるし。

git lfs でバイナリ用のバージョン管理をする。

git lfs がありまして、 git large file storage の略ですね。比較的大きめのファイルをまとめてツッコんでgit と連携させることが出来る github製のツールです。

github 以外でも bitbucketや gitlab で利用できます。

f:id:takuya_1st:20180103205002p:plain

使い方:クライアント

大きめのファイルをツッコんだら自動的にGit LFS になる。なんてことはない。このファイルはLFS管理しますよって設定が必要

なので、最初に このコマンドを突っ込む

git lfs install 

lfs のインストール

といっても、git lfs は git に同梱されておらず。別途インストールが必要。

brew install git-lfs

はじめの一歩

git lfs をインストール後に、レポジトリでlfs を有効にする、対象の拡張子を指定し設定する。そしてgitattributesを追加してcommit する。

git clone URL
cd REPO
git lfs install                #
git lfs track '*.psd'     # ここがlfs 特有の箇所
git add .gitattributes  #
git commit -m 'my commit comment'
git push origin master

git lfs install でlfs 初期設定

lfs install すると .git ディレクトリ内部に、lfs の管理フォルダが生成される

takuya@sample001$ find  .git/
/Users/takuya/.bin/find .git/ -mindepth 1 -not -iwholename '*/.git/*'
.git/config
.git/description
.git/HEAD
.git/info
.git/info/exclude
## ↓この辺が作られる
.git/lfs
.git/lfs/objects
.git/lfs/objects/logs
.git/lfs/tmp
.git/lfs/tmp/objects
.git/objects
.git/objects/info
.git/objects/pack
.git/refs
.git/refs/heads
.git/refs/tags

git lfs track でLFSの管理にするファイルのパターンをしてい、その設定が gitattributeに記述されるので、それを追加する。

git lfs track '*.rar' をした場合

gitattributes ファイルに、どのファイルをLFS対象にするか設定が書かれる。

takuya@sample001$ grep rar -R   .
./.gitattributes:1:*.rar filter=lfs diff=lfs merge=lfs -text

すでに設定があるので、重複したtrackも検出される。

takuya@sample001$ git lfs track '*.rar'
"*.rar" already supported

あとは commit

gitattributes も忘れずにコミットしないとね。

gitlab の場合

gitlab で git lfs を使う場合は、 lfs.url を追加しておく必要があった

git clone URL
cd REPO
git lfs install                
git config --add lfs.url https://example.com/takuya/sample01.git/info/lfs
git lfs track '*.psd'     
git add .gitattributes  
git commit -m 'my commit comment'
git push origin master

git lab のレポジトリURLの末尾に、 reponame.git/info/lfs を加えたものを追加した。

gitlab 側の設定

omni gitlab CE側では LFSを受け取れるように設定する必要があった。

### Git LFS
gitlab_rails['lfs_enabled'] = true
gitlab_rails['lfs_storage_path'] = "/var/opt/gitlab-lfs" 

lfs_storage_pathは自分で指定しておく必要がある。 reconfigure した時に、生成されパーミッションが設定された。

LargeFileが入ってくるところなので、それなりに安心して置いて置ける場所がいいと思う。

ディレクトリ設定に注意が必要だった。 ディレクトリは、gitlab レポジトリと別に設定できるので、管理対象として認識する必要がある。

ディレクトリを追加してるので、バックアップや移動時やDocker起動してるときに面倒だな

2018-01-03 追記

git config --add lfs.url は無くても動いた。

アイティメディアIDがパスワード12文字以下

アイティメディアIDを登録したらこんなことに。

f:id:takuya_1st:20171228144225p:plain

なぜ、パスワード文字数の上限が在るんでしょうか。

  • パスワード文字数の上限が在る
  • → 固定長でデータベースが設計されてる
  • → → AESかなにかでEncryptするなど原文まま保存している

つまり、ハッシュ化してないんじゃないかと。最近多いのかなぁ。パスワードといえばハッシュだと信じてた私が間違ってるんでしょうか?

rclone コマンドで google ドライブにデータを転送する(rcloneインストール方法と使い方)

rclone コマンドが便利

rclone コマンドは、各種のストレージサービス間でデータの転送が出来るように設計されたクライアントコマンド。

rclone は数多のクラウドと連携してクラウド間でデータ転送を行うことが出来て、各種サービスのフロントエンドプログラムを個別にインストールしなくてもまとめて使えるのでとても便利。

rclone で出来ること

強いよね。

対応してるクラウド

メジャーなものはたいてい対応してる

SFTPとowncloud サポートが在るので、rclone 使っててクラウド料金が嵩んだとして、自鯖で生き残れそうですね。

rclone のインストール

macOS / OS X

brew install rclone

debian

sudo apt install rclone

ubuntu server には apt パックに rclone がなかった

ubuntu などその他

curl https://rclone.org/install.sh | sudo bash

rclone を使ってみる

リモート設定をするのはちょっとあとにして、まずは使ってみる

rclone sync ~/Desktop/sample ~/Desktop/backup
rclone copy  ~/Desktop/sample.txt ~/Desktop/copied.txt

ローカルで使えることがわかった。

google driveにアクセス設定をする

google drive にアクセするには2つの手順が必要

  • rclone をOAUTH クライアントとして設定
  • Driveのアクセス権限を rclone にOAuthで渡す。

rclone に oauth クライアントIDを設定

GoogleAPI Consoleにログインして

  • 新規プロジェクト作成
  • 作ったプロジェクトで Google drive api を有効にする。
  • 作ったプロジェクトのoauthクライアントIDを作る
  • 作ったプロジェクトのoauthシークレットを取り出す。

つまり、誰のGoogle アカウントのAPI権限で rclone を動かすのかって言う設定ですね。

create credentials で oauth client を選べばおっけ

f:id:takuya_1st:20171227202056p:plain:w400

google drive の許可設定

つぎに、アクセスしたい google drive のオーナーから 、 rclone に許可を出す必要がある。

rclone に google drive を設定する。

rclone config コマンドで、新規作成する。

takuya@~$ rclone config

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q>

クライアントのIDとシークレットをいれる。

rclone をどのプロジェクトとして動かすかの先程設定したクライアントIDを設定して決定する

Storage> 9
Google Application Client Id - leave blank normally.
client_id> lrgchkfmyhsdr7ey
Google Application Client Secret - leave blank normally.
client_secret> uzhjqwosqs9zgxqa

空白でもいいっていうメッセージが出て来るが、これを空白にすると、403 Rate Limite Exceeded で苦しむことになる。端的に言うと、rclone を使ういろいろな人と クライアントIDを共有するので、転送上限も共有することとなって、上限になっちゃうよってことでしょうね。→ https://github.com/ncw/rclone/issues/1591

OAuthでrclone Drive のアクセス権限を渡す。

最後に、 OAuth して、ブラウザが起動されるので、「使いたいドライブのオーナー」としてログインして、rclone にアクセス権限を渡す。

ブラウザ経由のOAuthの権限委譲の、この処理が挟まるので、出来る限りサーバや仮想マシンや docker イメージで rclone を設定せずにデスクトップの端末でrclone を初期設定するべき。楽だからね。

設定まとめ。

「rclone が、誰のAPIアクセスとして、誰のドライブを扱うのか」です。

登場人物は3つ、

  • rclone (アプリ
  • API IDの保持者
  • ドライブの保持者

ですね。

設定ファイルのコピーと移動

設定ファイルは次の場所に保存される。

~/.config/rclone/rclone.conf

このファイルの中に、クライアントIDとOAuthのアクセストークンが入ってるので厳重に管理する。

このファイルをコピーすれば、別のパソコンやサーバーで設定しなくても同じ設定が使えるようになる。

rclone の設定一覧

rclone でいまどのクラウド・ドライブを設定しているか一覧を見るにはこれ。

rclone listremotes

rclone でGoogle Driveのフォルダを見る

rclone lsd myDrive:
rclone lsd myDrive:/ #または

rclone でGoogle Driveの最上位ディレクトリを見ることが出来る。

rclone で 特定のフォルダの中を見てみる

rclone ls myDrive:/name/to/my/forlder

フォルダの名前でアクセスできるから便利!

rclone で同期する

sync で同期する

## dry-run
rclone sync -n /path/to/my/folder  myDrive:/name/to/my/forlder
## not dry-run
rclone sync  /path/to/my/folder  myDrive:/name/to/my/forlder

sync するとローカルに無くて、リモートに在るファイルは「削除」されるので手作業で試すときはかならず -n をつけること

同期の書き方

rclone sync  SRC DST

同期するときは SRC のファイルがDSTに転送される。SRCとDSTが絶対に同じ状態になる。

  • SRC になくて、DSTにだけ在るファイルは削除される。
  • DST になくて、SRCにだけあるファイルは新規作成される。
  • SRC と DST でサイズが異なり、日付が違うファイルは SRCに合わせる。

オプションをつけないと結構ガンガン消されたり更新されるので注意が必要

日付があてにならないときは md5 などハッシュで当てることも出来る。遅いからやらないけど。

google driveのバージョン管理は???

次のキャプチャが、sync でローカルの更新ファイルをGoogle Driveにコピーした例。

ちゃんと、Google Driveのバージョン管理(旧版)として認識されている。

f:id:takuya_1st:20171227204437p:plain

表示を少なくしたいとき

quiet な表示には -q オプションで行ける

自動実行なんかはコレで楽になるよね。

転送量について

ちゃんとクライアントIDを設定しても 403 User Rate Limit Exceededが出て来ることがある。複数台で一度に転送しようとすると出てくることがある。ちゃんとクライアントIDを分けてドライブのアクセス上限にかからないようにしたほうがいい。

フォルダが存在しないときはどうなるの

rclone sync  /path/to/my/folder  myDrive:/name/to/my/no_exists_foldername

存在しないフォルダ名を指定したら、そのフォルダが作成されて、その中にファイルが放り込まれる。上手に使えば毎月のアーカイブを作れる。

その他のツール

rclone の他にも google drive をぱぱっと使えるコマンドは結構ある。

FUSEでマウントする系もあるんだけど、遅いから使うのやめちゃった。

FUSEマウントより、fsevent/ inotify でファイルシステムの変更イベントでデータ同期したほうが楽だし速いしね。

濫用は禁物

OneDriveもAmazon DriveもDropboxもみんなが乱用して、容量制限ができたり値上げされたりしたので、ほどほどに使ったほうがいいですよ。

みんながガンガン使うと結局は料金プランが値上がりして損をしますから。とくに学生の方々は、無料だからと言って数10TBとか使うとたぶん無料プランなくなるのでほんとうに程々に使いましょうね。

バックアップに使うと便利なんだけど、ご利用は計画的にね

参考資料

Rclone started returning errors after uploading at most 800gb · Issue #1591 · ncw/rclone · GitHub