ケメログ -ケメ子のブログ-

ケメ子のブログ

GitHubのリポジトリをpushする際に100MB超過ファイルを過去に遡って削除する方法

ある日、github を使ってたら、こんなエラーが出てきたんだよね。

 

Total 119 (delta 58), reused 1 (delta 0)

remote: Resolving deltas: 100% (58/58), completed with 10 local objects.

remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.

remote: error: Trace: ×××××××××××××××××××××××

remote: error: See http://git.io/iEPt8g for more information.

remote: error: File ××××××/×××××× is 1793.91 MB; this exceeds GitHub's file size limit of 100.00 MB

To https://github.com/user_name/repository_name.git

 ! [remote rejected] master -> master (pre-receive hook declined)

error: failed to push some refs to 'https://github.com/user_name/repository_name.git'

 

エェー、Github って100MB以上のファイル送れないのー!!!

 

ってびっくりしました。

 

ってところまでは良かったんだけれど、なんかそれでrm して、もう一回add → commit → push しようと思ったらまた

 

Total 119 (delta 58), reused 1 (delta 0)

remote: Resolving deltas: 100% (58/58), completed with 10 local objects.

remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.

remote: error: Trace: ×××××××××××××××××××××××

remote: error: See http://git.io/iEPt8g for more information.

remote: error: File ××××××/×××××× is 1793.91 MB; this exceeds GitHub's file size limit of 100.00 MB

To https://github.com/user_name/repository_name.git

! [remote rejected] master -> master (pre-receive hook declined)

error: failed to push some refs to 'https://github.com/user_name/repository_name.git'

 

って出たからこりゃおったまげた。

 

これはどうやら、「git って履歴管理とかもできるけど、その履歴に100MB 以上のファイルがあるから送れないやで」

 

ということらしい。

 

めんどくさい... 

 

解決方法を記そう

 

 

以下の記事に記述があります

 

GitHubへ既存リポジトリをPushする時に100MB超過ファイルを過去に遡って削除する方法

 

ということで、この記事に解決方法がしっかり書いてある。

 

「おい!書いてあるならブログで取り上げんでもええじゃろうが!」と思うかもしれない。

 

でも、ちょっと待って欲しい。

 

Webにある記事が、全て有用とは限らないの。というより、結構な確率でゴミ記事があるの。

 

なので、このブログはメモがわりに、その有能な記事を集めていこうという趣旨なの。

 

だから、記事を書いてくれた人に感謝させてもらいながら、引用させてもらうわね。

 

ありがとう

 

別の解決方法

ちなみに、なんか大量のファイルを送れるようにするlfs(?) というのもあるらしいけど、なんかmac 以外だと多少めんどくさいらしいので却下。

 

というより、大学のスパコン借りている時点でそういうのできなさそう。

 

私も権限が欲しい。

 

Paraview でScaler 値 の変数をいくつか使って Vector 図を描くやり方

この前の研究会、一番言われて「そうだよなぁ...」と思ったのが、先輩の

 

「そのグラフ、Vector図の方が見やすくないっすか?」

 

でした。

 

まぁ、私もそう思ったのですが何せやることが色々あって細かいところまで気が回らなかったんですよ。

 

ごめんなさい。

 

と言うことで、タイトルどうり「Paraview でScaler 値 の変数をいくつか使って Vector 図を描くやり方」を書いていきます。

 

このWebページをみよ!

と前口上をグダグダ書いておいてあれなんですがググったら一発で見つかったのでURLを載せておきます。

 

https://www.rccm.co.jp/icem/pukiwiki/index.php?成分からベクトル作成

 

いい記事を書いているんだから、タイトルには気を遣って欲しいなぁ... なんて。

 

2019年10月現在、このやり方でできたので、試して見てください。

 

Python使ってLinuxのコマンド終了時にLine でプッシュ通知してくれるやつ

いや、デフォで入ってろよ、というのがこれね。

そもそも、なんかのコマンドの終了通知くらいもとから入っててしかるべきだと思うんだけど、なかったので作りました。

 

まぁ、相変わらず「なんちゃってコーダー」なので参考程度に見てみてください。

 

 Line に通知を送るスクリプト

# -*- coding: utf-8 -*-
import requests
import sys

args = sys.argv

class LINENotifyBot:
    API_URL = 'https://notify-api.line.me/api/notify'
    def __init__(self, access_token):
        self.__headers = {'Authorization': 'Bearer ' + access_token}

    def send(
            self, message,
            image=None, sticker_package_id=None, sticker_id=None,
            ):
        payload = {
            'message': message,
            'stickerPackageId': sticker_package_id,
            'stickerId': sticker_id,
            }
        files = {}
        if image != None:
            files = {'imageFile': open(image, 'rb')}
        r = requests.post(
            LINENotifyBot.API_URL,
            headers=self.__headers,
            data=payload,
            files=files,
            )

if __name__ == '__main__':
    bot = LINENotifyBot(access_token='ACCESS TOKEN NUMBER')

    if(len(args) > 1):
        if(args[1] == "ERROR"):
            bot.send(message="Something is Wrong!!")
        elif(args[1] == "START"):
            bot.send(message="Simulation is Start!!")
        else:
            bot.send(
                message=args[1] + ' is done!!',
                image='owatta.png',  # png or jpg
                #sticker_package_id=1,
                #sticker_id=13,
            )

 

とりあえず、↑が「Line に通知を送るスクリプト」です。

詳しいことは、この記事(https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9) を見てください。

 

やっていることはほとんど同じです。

 

一応もう少し細かいことを書いておくと、

 

コマンドライン引数が

  1. python ○○.py ERROR の時 ... エラー通知をする
  2. python ○○.py START の時 ... 正常にスタート通知をする
  3. python ○○.py JOBNAME の時 ... 「JOBNAME is done!」を通知する

こんな感じです。

 

通知を送るシェルスクリプト

 

次は、この通知を送るシェルスクリプトです。

私もいまいちわかってないので、説明はしないけど。


#!/bin/bash

#変数がなかったら、エラーを吐いて終了
if [ $# = 0 ]; then
    echo "need argument 'job number'" 1>&2
    python ./line_notify.py ERROR
    exit 0
fi


function waitfunction_by_jobname() {

  python ./line_notify.py START

  while :
  do
    RET=$(qstat | grep $1 | wc -l)
    if [ $RET -eq 0 ]; then
      return
    else
      echo "Sleep 60sec"
      sleep 60
    fi
  done
}

echo "Monitoring Start"

#最初の引数($1)の名前がでてこなくなるまで待つ
waitfunction_by_jobname $1

#ディレクトリの.py を実行して通知を送る
python ./line_notify.py $1

echo "$1 is done & Send Notification!"

exit 0

 

 

こちらは、この記事(https://qiita.com/ssh0/items/7baa0cd094d9fb7561e1) を参考にしました。

 

動作としては、

  1. 引数がないときは先ほどのpython コードに引数ERROR を入れて実行
  2. 引数の正確なjobname を入れると、先ほどのコードに引数JOBNAMEを入れて実行

 

しれくれます。

 

もう少しだけ詳しく書くと、60 秒ごとにqstat で実行しているjobname を表示させて、その中で「引数に取った jobname がなくなる」まで永遠にループしてくれます。

 

 

スクリプトの動かし方とか

 

 このスクリプトを、nohup というコマンドを使って走らせます。

こんな感じで。

 


    nohup sh ○○.sh JOBNAME

 

 nohup コマンドは、ssh の接続を切っても実行してくれるんだ。すごいね。

 

これをやると、こんな感じで通知が届く。うれしいね。

 

 

ラインで通知しれくれるやーつ

Line Notify

 

これでたくさん研究ができるね!

 

わーい...

 

 

...

 

 

わー... い? 

GitHubからディレクトリの一部を直接ローカルにダウンロードする方法(svn)

GitHub ってめーっちゃ便利だけど、たまーに「これやりたい!」って思うことが意外とできないとイラッとするよね。

 

github-download

github画面



github 上にある特定のディレクトリをダウンロードしたいけど、なんかやり方わからないからこの「clone or download」をポチッとしてローカルに落としている人も多いんじゃないだろうか?

 

え、私だけ?

 

まぁ良いや、そこで、この記事では「GitHubからディレクトリの一部をローカルにダウンロードする方法」を紹介するよ。

 

結論としては、SVN を使うよ。

 

 

Githubからローカルにダウンロードする方法

コマンドだよ。

svn export https://github.com/ユーザー名/リポジトリ名/trunk/ディレクトリ名

これでいけるハズ。私はいけた。

 

この trunk がもしかしたら変なところにあるかもしれないので、コマンド打ってどこにあるか確認してほしい。

 

あとは、clone したりしておかないと後でひどい目に合うという話も聞いたけど、そこらへんもまだ不具合が起きていないので、あったらまた追記します。