- 投稿日:2020-02-25T21:58:56+09:00
Git備忘録
設定
~/.gitconfig
[user] name = Yasushi SHINOHARA email = hogehoge@hoge.com [core] editor = vim
~/.emacs
;;disable the version control with emacs (setq vc-handled-backends nil)コマンド
誤ってステージにのせてしまったファイルを管理対象から外したい
git rm --cached ./hoge/hogehoge.pyc
gitk
gitkのフォントが小さいとき、
~/.config/git/gitk
のset mainfont
,set textfont
,set uifont
の数字を大きくすればよい。
- 投稿日:2020-02-25T18:55:20+09:00
gitのコミットメッセージにissue番号を自動で含める方法
gitのコミットメッセージにissue番号を自動で含める方法を探した結果、
prepare-commit-msg
を修正しました。前提条件
- ブランチ名は
#10
や#10_test
のような、issue番号以外に数値を使用しない形式であること使い方
設定
cd
コマンドでプロジェクトルートからディレクトリを移動します。cd .git/hooks
touch
コマンドでファイルを作成します。$ touch prepare-commit-msgprepare-commit-msg
ファイルには以下の記述を行います。#!/bin/sh mv $1 $1.tmp echo "#`git branch | grep "*" | awk '{print $2}' | sed -e "s/\([^0-9]\)//g"` `cat $1.tmp`" > $1コミット
以下の内容でコミットします。
テストコミット出力結果
#10 テストコミット参考文献
この記事は以下の情報を参考にして執筆しました。
- 投稿日:2020-02-25T17:22:49+09:00
PowerShellでgitignoreが効かない
はじめに
PowerShellでgitコマンド叩いてて、
git init echo "close.txt" > .gitignoreとしても
.gitignore
が有効にならないので相当ハマった。同じことで悩んでいる人向けに情報共有
原因は文字コード
PowerShellのversion5以前ではリダイレクト処理の文字コードがBOM付きUTF16になる。これが原因で
.gitignore
が上手く機能していなかた。解決法
PowerShellのversion確認は、
$PSVersionTable
コマンドを表示する。単にterminalにこの文字を打てばよい。version 5.XだったらUTF16が原因である可能性がある。PowerShell core のversion 6以降をインストールする。もしくはgit bashなど別のbashシステムを使う。
※注意
WSLを使いたいところですが、ファイルIOが低速ゆえに、シェルスクリプト等を組んでgitコマンドを流すと、checkout系の切り替えに実際のディスク上のファイル変更が間に合わず、エラーになることがあります。しかもIOのタイミングで結果が変わってしまうので問題の再現性が見られず、相当悩みます。gitを使うのはWSL2まで待った方がよさそうです。
- 投稿日:2020-02-25T17:18:50+09:00
Git公開用に第2のブランチ(方法2)
今回の情報の対象
- 個人or社内開発のリポジトリはOnedriveや社内クラウドなどのクローズド環境に置いている(クローズドリポ)。
- 公開用ソースは、それとは別のリポジトリ(Github等)にしたい(パブリックリポ)。
- パブリックリポでは、公開するファイルを削りたい。
- 開発履歴コメントも、公開用に再整理したい。
ここで、今回の方法では、クローズドリポのコメントはある程度捨ててしまってよい場合や、むしろ捨ててしまって再編集したコメントだけ残したい場合を想定しています。
- コメントも公開用には奇麗で整えたものにしたい。
- 非公開の開発用コメントは、細かく、個人の癖のあるものだ(粒度の小さい)
という状況です。
なんとか目的を達した方法
先に例題のコマンド載せます。私の冗長な文章よむよりもコマンド見た方が早いって人も多いと思うんで。クローズドブランチを
master
、パブリックブランチをpub
とします。close.txt
が公開したくないファイルで、pub
ブランチからはそれを除きます。mkdir gittest cd gittest #(1)prepare closed branch "master", and do commit 3 times. git init echo "bigdata" > .gitignore git add .gitignore git commit -a -m "master1" echo "master close2" > close.txt git add close.txt git commit -a -m "master2" echo "master open3" > open.txt echo "master close3" > close.txt git add open.txt git commit -a -m "master3" #(2)make public branch "pub" #git checkout -b pub `git rev-list --reverse HEAD | head -1` git checkout -b pub (master1のコミットID) echo "/close.txt" >> .gitignore echo "/.gitignore merge=ours" >> .gitattribute git add . git commit -a -m "1st pub" #(3)merge by squash and reset to unstage ignored files git merge --squash -Xtheirs master #git reset `git ls-files --full-name -i --exclude-standard` git reset git add . git commit -m "pub3" #(4)advance to develop on closed "master" branch git checkout master echo "master open4" > open.txt echo "master close4" > close.txt git commit -a -m "master4" echo "master open5" > open.txt echo "master close5" > close.txt git commit -a -m "master5" #(5) merge to pub same as (3) git checkout pub git merge --squash -Xtheirs master #git reset `git ls-files --full-name -i --exclude-standard` git reset git add . git commit -m "pub5"ここで、開発が進むたびに(4)から(5)が繰り返されます。
また、(1)の直後に、
.git/config
に以下を追加します。これで、.gitignore
がmergeによって書き換わらなくなります。[merge "ours"] name = "Keep ours merge" driver = trueただし、mergeでは書き換わらないので、クローズドリポの方で.gitignoreに追記した場合には、手動で公開用リポの
.gitignore
も書き換えてやる必要があります。初回以外は毎回手順(3)でマージすることになります。ここで、
merge --squash
でマージしますが、これだけだと公開リポでは無視したいclose.txt
もステージングされてしまっています。そこで、一旦git reset
で全てのステージングを取り消し、再度git add .
でステージングします。これによって、.gitignore
で指定したファイルが公開用ブランチで正常に無視されます。この部分はコメントアウトしたgit reset `git ls-files --full-name -i --exclude-standard`でも代用できます。PowerShellではバッククォートによるコマンドが動かないので、今回はこのようにしました。
注意
Windows環境では、PowerShellなら問題ないですが、WSL(Windows10 1903)上で動かすと、ファイル操作が遅いためか時々おかしな動作になります。ファイルが消えていなかったり。消したはずのファイルが残っていたり。よって、上記コマンドの例題のコマンドも途中で失敗することがあります。特に
git checkout
で消したはずのファイルが消えてなかったりしてErrorになります。別の方法
開発履歴とコメントもできるだけ残したい場合は、前回の記事を参考にどうぞ
- 投稿日:2020-02-25T15:55:17+09:00
【Git】ファイルをcommitやaddした後に.gitignoreを反映する
- 投稿日:2020-02-25T14:12:21+09:00
LINE botの作成 〜作成・デプロイ・起動まで〜
はじめに
LINE botを作りたくなったので練習がてら、オウム返しのLINE botに挑戦。
その時のメモ、日記。環境
- Ubuntu 18.04.3 LTS
- Python 3.6.8
- Flask==1.1.1
- line-bot-sdk==1.15.0
- Heroku
必要なパッケージのインストール
$ pip3 install flask $ pip3 install line-bot-sdk目標
出来上がりはこのようになります。
LINEのQRコードリーダーで以下のQRコードを読み込んでください。
なにかコメントするとオウム返ししてくれます。登録
LINE Developers
LINE botのアカウントを作成するため、LINE Developersに登録する。
1.今すぐ始めようをクリック。
2.ログイン
ログインをする。既に持っているIDでも問題ない。
他の人に自分のLINEが知られることはない。あくまでもLINE botと利用するためのログイン。
3.LINE botアカウント作成
3-1.チャネルの種類はbotなので「Messagin API」を選択
3-2.botの提供元であるプロバイダ名を設定
3.3.その他の設定
下の項目を設定して「作成」ボタンをクリック。
- チャネルアイコン
- チャネル名
- チャネル説明
- 大業種
- 小業種
- メールアドレス
4.チャネルシークレットとチャネルアクセストークンの取得
4.1. 「チャネル基本設定」タブを選択
4.2.「チャネルシークレット」欄から「発行」ボタンを押し、IDを取得。後ほど[YOUR_CHANNEL_SECRET]として利用。
4.3. 次に、「Messaging API設定」タブを選択
4.4. 「チャネルアクセストークン」欄から「発行」ボタンを押し、IDを取得。後ほど[YOUR_CHANNEL_ACCESS_TOKEN]として利用。
Heroku
1. アカウント登録
こちらのリンクからHerokuのアカウント登録をする。
2. Set up
Heroku CLIのSet upをする。
端末で以下のコマンドを打ち込む。
参考はこちら。$ sudo snap install heroku --classicログインをする。以下のコマンドを実行するとブラウザが立ち上がるのでそこでHerokuにログイン。以下のような感じのメッセージがでれば成功。
$ heroku login heroku: Press any key to open up the browser to login or q to exit › Warning: If browser does not open, visit › https://cli-auth.heroku.com/auth/browser/*** heroku: Waiting for login... Logging in... done Logged in as me@example.com実装
オウムがえしのコード作成
line-bot-sdk-pythonにあるコードを使用します。
["YOUR_CHANNEL_ACCESS_TOKEN"]と["YOUR_CHANNEL_SECRET"]はここでは自分のものに置き換えず、そのままで大丈夫です。main.pyfrom flask import Flask, request, abort from linebot import ( LineBotApi, WebhookHandler ) from linebot.exceptions import ( InvalidSignatureError ) from linebot.models import ( MessageEvent, TextMessage, TextSendMessage, ) import os app = Flask(__name__) #環境変数取得 # not should be chnged chracters. YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"] YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"] line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN) handler = WebhookHandler(YOUR_CHANNEL_SECRET) @app.route("/callback", methods=['POST']) def callback(): # get X-Line-Signature header value signature = request.headers['X-Line-Signature'] # get request body as text body = request.get_data(as_text=True) app.logger.info("Request body: " + body) # handle webhook body try: handler.handle(body, signature) except InvalidSignatureError: abort(400) return 'OK' @handler.add(MessageEvent, message=TextMessage) def handle_message(event): line_bot_api.reply_message( event.reply_token, TextSendMessage(text=event.message.text)) if __name__ == "__main__": # app.run() port = int(os.getenv("PORT", 5000)) app.run(host="0.0.0.0", port=port)Herokuへのデプロイ
必要なファイルの準備
Herokuで必要となるファイルは以下の3つです。
- Procfile (Herokuで実行するコマンド)
- requirements.txt (main.pyを動かす上で必要なパッケージ)
- runtime.txt (使用する言語とバージョン)
Procfileweb: python3 main.pyrequirements.txtFlask==1.1.1 line-bot-sdk==1.15.0runtime.txtpython-3.6.8ログイン
端末からHerokuへ、ログインしてください。
$ heroku login heroku: Press any key to open up the browser to login or q to exit › Warning: If browser does not open, visit › https://cli-auth.heroku.com/auth/browser/*** heroku: Waiting for login... Logging in... done Logged in as me@example.comアプリの作成
Herokuにアプリを作成します。
$ heroku create <app_name> Creating ⬢ <app_name>... done https://<app_name>.herokuapp.com/ | https://git.heroku.com/<app_name>環境変数の設定
「4.チャネルシークレットとチャネルアクセストークンの取得」で取得したチャネルアクセストークン[YOUR_CHANNEL_ACCESS_TOKEN]とチャネルシークレット[YOUR_CHANNEL_SECRET]をHerokuの環境変数として設定する。
# LINE botのチャネルアクセストークンを使用 $ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="<Access Token>" --app <app_name> # LINE botのチャネルシークレットを使用 $ heroku config:set YOUR_CHANNEL_SECRET="<Channel Secret>" --app <app_name>Webhookの設定
「3.LINE botアカウント作成」で作成したアカウントページに戻って、Messagin API設定タブをクリック。
Webhook設定欄のWebhookの利用をオンにする。
さらに、WebhookURLに以下を記載。Webhook URL:https://<app_name>.herokuapp.com/callbackデプロイの実行
Pythonプログラム(main.py)と設定ファイルデプロイします。
# 初期化(initialize) $ git init # commitするファイルを追加 $ git add . # commit $ git commit -m "new commit" # deploy $ git push heroku masterLINE botでの実行結果
いい感じに返してくれました。
[番外編]つまづいたところ
git commitで「Please tell me who you are.」
git commitでお前誰だと怒られる。
gitの初期設定ができていないようです。$ git commit -m "new commit" *** Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity. Omit --global to set the identity only in this repository. fatal: unable to auto-detect email address (got '○@○Air2.(none)')メールアドレスとアカウント名を設定してあげるとエラーが無くなる。
私の場合は、Githubで作成したメールアドレスとアカウント名を使用しました。$ git config --global user.email "you@example.com" $ git config --global user.name "Your Name"設定した、メールアドレスとアカウント名等はこのコマンドから確認できます。
$ git config --listpush時にdoes not appear to be a git repository
デプロイするさいに、repositoryがないと怒られました。
gitがリモートのリポジトリを探せていないようです。$ git push heroku master fatal: 'heroku' does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.リモートリポジトリ先を確認すると、ところが"heroku create "で作成したものと異なっていた。
$ git remote -v heroku https://git.heroku.com/<app_name>.git (fetch) heroku https://git.heroku.com/<app_name>.git (push)リモートリポジトリ先の変更は以下のコマンドでできる。
$ git remote set-url heroku {ここに変更するURLを貼り付け} # ex.) git remote set-url heroku https://git.heroku.com/<app_name>.git仮に、"git remote -v"でなにも出力されない場合。
"git remote add"してやる。$ git remote add heroku https://git.heroku.com/<app_name>.git
「メッセージありがとうございます...」という自動返信がついてくる。
オウムがえしと共に自動返信のメッセージがついてくる。
こちらは、LINE botアカウントの「Massaging API設定」タブから応答メッセージの編集から変更できる。
「Massaging API設定」タブから応答メッセージの編集を押す。
main.pyを編集したときの更新
オウムがえしのコードを書き換えてmain.pyを更新した場合。デプロイし直す必要がある。
1.main.pyの更新。$ git status ブランチ master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: main.py no changes added to commit (use "git add" and/or "git commit -a")2.git addする。
$ git add .3.git commitする。
# -aでGit 管理下のファイルをすべてをコミットする $ git commit -am "modified main.py" [master d3cfd15] modified main.py and git add. 1 file changed, 1 insertion(+)4.デプロイする
$ git push heroku master
まとめ
LINE botを作成するために、種々の登録から、ファイルの作成、Herokuでデプロイをした。
将来的には、株価予測AIが判定した結果を定期的にLINEで通知するシステムを構築したい。
- 投稿日:2020-02-25T00:28:59+09:00
ローカルでしか使わないファイルをGit管理から除外する方法
Git管理したくないファイルパスを
.git/info/excluede
に書き込め。# local_only.sh をGit管理から外すぞ $ git status On branch master Your branch is up to date with 'origin/master'. Untracked files: (use "git add <file>..." to include in what will be committed) local_only.sh nothing added to commit but untracked files present (use "git add" to track) # .git/info/excluede に追記するぞ $ echo localonly.sh >> .git/info/excluede # やるやんけ $ git status On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree cleanこれでうっかりコミットするようなことがなくなります。