20200225のGitに関する記事は7件です。

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/gitkset mainfont, set textfont, set uifontの数字を大きくすればよい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

gitのコミットメッセージにissue番号を自動で含める方法

gitのコミットメッセージにissue番号を自動で含める方法を探した結果、prepare-commit-msgを修正しました。

前提条件

  • ブランチ名は#10#10_testのような、issue番号以外に数値を使用しない形式であること

使い方

設定

cdコマンドでプロジェクトルートからディレクトリを移動します。

cd .git/hooks

touchコマンドでファイルを作成します。

$ touch prepare-commit-msg

prepare-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 テストコミット

参考文献

この記事は以下の情報を参考にして執筆しました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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まで待った方がよさそうです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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になります。

別の方法

開発履歴とコメントもできるだけ残したい場合は、前回の記事を参考にどうぞ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Git】ファイルをcommitやaddした後に.gitignoreを反映する

すでにaddやcommitしたファイルに、.gitignoreを反映させる方法が中々覚えられないので、アウトプットする。(先に入れとけ)

方法

git add .gitignoreして、

git rm --cached `git ls-files --full-name -i --exclude-from=.gitignore`

参考

https://qiita.com/yuuAn/items/b1d1df2e810fd6b92574

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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コードを読み込んでください。
なにかコメントするとオウム返ししてくれます。

image.png

登録

LINE Developers

LINE botのアカウントを作成するため、LINE Developersに登録する。

1.今すぐ始めようをクリック。

image.png

2.ログイン

ログインをする。既に持っているIDでも問題ない。
他の人に自分のLINEが知られることはない。あくまでもLINE botと利用するためのログイン。
image.png

3.LINE botアカウント作成

ログインするとこのような画面になる。
image.png

3-1.チャネルの種類はbotなので「Messagin API」を選択

image.png

3-2.botの提供元であるプロバイダ名を設定

なんでもOK.
image.png

3.3.その他の設定

下の項目を設定して「作成」ボタンをクリック。

  • チャネルアイコン
  • チャネル名
  • チャネル説明
  • 大業種
  • 小業種
  • メールアドレス

image.png

4.チャネルシークレットとチャネルアクセストークンの取得

4.1. 「チャネル基本設定」タブを選択

image.png

4.2.「チャネルシークレット」欄から「発行」ボタンを押し、IDを取得。後ほど[YOUR_CHANNEL_SECRET]として利用。

image.png

4.3. 次に、「Messaging API設定」タブを選択

image.png

4.4. 「チャネルアクセストークン」欄から「発行」ボタンを押し、IDを取得。後ほど[YOUR_CHANNEL_ACCESS_TOKEN]として利用。

image.png

Heroku

1. アカウント登録

こちらのリンクからHerokuのアカウント登録をする。
image.png

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.py
from 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 (使用する言語とバージョン)
Procfile
web: python3 main.py
requirements.txt
Flask==1.1.1                
line-bot-sdk==1.15.0
runtime.txt
python-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設定タブをクリック。
image.png

Webhook設定欄のWebhookの利用をオンにする。
image.png
さらに、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 master

LINE botでの実行結果

いい感じに返してくれました。

image.png

[番外編]つまづいたところ

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 --list

push時に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設定」タブから応答メッセージの編集から変更できる。
image.png

「Massaging API設定」タブから応答メッセージの編集を押す。
image.png

詳細設定から応答メッセージの応答メッセージ設定を選択。
image.png

不要な応答メッセージのステータスをオフにする。
image.png

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で通知するシステムを構築したい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ローカルでしか使わないファイルを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

これでうっかりコミットするようなことがなくなります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む